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”。 有没有简明的方法来做到这一点? –