0

请参阅以下代码片段:

const
  fun1 = () => Either.of(1),
  fun2 = () => Either.of(2),
  fun3 = () => Either.of(3),
  fun4 = curry((x, y, z) => Either.of(x + y + z)),
  fun5 = x => Either.of(x + 1),
  fun6 = () => pipeK(
    () => sequence(Either.of, [fun1(), fun2(), fun3()]),
    apply(fun4),
    fun5
  )(),

result = fun6() // returns 7

fun4需要 3 个参数,只有当它们都是正确的参数时,我才想给出它们。也就是说,sequence将应用每个单子值,因此我将它们作为一个包含原始、、、返回值的单一权限。fun1fun2fun3

这是推荐的方法吗?

单击此处运行整个代码段

4

1 回答 1

2

不,我不会使用sequence数组和apply. 我认为更惯用的方法是使用ap

const fun6 = () => chain(fun5, unnest(ap(ap(ap(Either.of(fun4), fun1()), fun2()), fun3())));
// or
const fun6 = () => chain(fun5, unnest(ap(ap(map(fun4, fun1()), fun2()), fun3())));
// or
const fun6 = () => Either.of(fun4).ap(fun1()).ap(fun2()).ap(fun3()).chain(identity).chain(fun5);

Haskell 中的等价物是fun5 =<< join (fun4 <$> fun1 <*> fun2 <*> fun3). unnest返回一个 Either时需要,这fun4可能不是必需的。

于 2017-10-23T12:27:45.713 回答