0

我使用ramda-fantasy單子。我有一個字符串裏面可能和一些函數,將執行字符串正則表達式匹配並返回Maybe String應用功能列表,可能在Javascript中的價值

如何映射可能應用所有功能並連接結果?

我已經

const fieldRetrievers = [ 
    getAddress, 
    getName, 
    getPhone, 
] 

const text = Maybe.of("a text") 

// I want to define 
// List (String -> Maybe String) -> Maybe String -> Maybe String 
function getInfo(retrievers, maybeText) {...} 

我怎樣才能做到這一點?

+0

你想從addr的名字部分獲得電話這是字符串的一部分嗎? – Bergi

回答

1

您正在尋找composeK,它是一元結構(「kleisli arrows」)上的函數組合。

基本上,你得到的函數應該反覆chain到輸入:

text.chain(getAddress).chain(getName).chain(getPhone) 

,你可以實現使用reduce在你的功能陣列:

R.reduce((m, f) => m.chain(f), text, fieldRetrievers) 

所以你會寫

const getInfo = R.flip(R.reduce(R.flip(R.chain))) 
+0

不錯。但是如果其中一個函數返回Nothing,整個結果將是Nothing。我想忽略所有'Nothing'。 –

+0

你是什麼意思,忽略?如果不是'Nothing',你還能返回什麼?請提供一些示例函數,其中包含示例輸入以及問題中的預期輸出。 – Bergi

+0

想象一下,我有字符串'「名稱:約翰|地址:Apple Street」'。在這個例子中,'getName'會返回'Just'John'',getAddress將返回'Just'Apple Street''並且getPhone將返回'Nothing'。 我的目標是針對原始字符串運行所有這些函數並連接結果,忽略「Nothing」。 在我給出的例子中,期望的輸出是「John,Apple Street」。 有沒有簡明的方法來做到這一點? –