函数式编程将Monad数组转换为单个Monad数组

时间:2019-11-02 06:25:57

标签: javascript functional-programming monads ramda.js

我有这样的单子数组

[Left("a"), Left("b"), Left("c")]

我想将其转换为这种形状

Left(["a", "b", "c"])

我该怎么做?

是否有专门的操作员来做这样的事情?还是我应该自己写?

1 个答案:

答案 0 :(得分:3)

正如评论所建议的那样,这对于Either.Left类型来说是一个不寻常的功能。 Ramda的sequence可与Either.Right一起使用:

console .log (
  sequence (of, [Right('a'), Right ('b'), Right ('c')] ) //~> Right (['a', 'b', 'c'])
)
<script src="//bundle.run/ramda@0.26.1"></script>
<script src="//bundle.run/ramda-fantasy@0.8.0"></script>
<script>const {sequence} = ramda, {Either: {Left, Right, of}} = ramdaFantasy</script>

但这是因为Right表示成功处理并带有结果值,而Left表示失败将停止进一步的处理。与Maybe相似,除了它捕获导致处理中断的初始错误。

还有其他类型可以捕获多个错误。例如,来自FolktaleMonetValidation类型捕获多个错误,但是这些错误通常将被包装在单个Failure实例中,而不是在它们的数组中。

很明显,您可以为此编写自己的函数,但是不太可能遵循明确的法律。