1

在以无点风格写这篇文章时,我希望得到一些帮助。

对于上下文:该函数采用 Either 类型的 Array 并返回 Task 类型。任务类型被任何具有左集的 Either 类型拒绝。如果左侧集合中没有 Either 类型,则解析任务类型。这是以这种方式使用的:

    Async.parallel(xs).             
        map(eachToEither).          
        chain(rejectAnyLefts).      
        fork(error, success)

在实践中,我会添加另一个链(就在分叉之前)来执行 perist。但首先我要确保我的代码是尽可能地地道的。手头的函数是我想编写无点的rejectAnyLefts,但是有几件事让我陷入了循环。

  1. 如果
  2. 需要存储要在 IF 中使用的 leftObjs 值以及可能的返回值
const rejectAnyLefts = function(eitherArray){
    const leftObjs = r.filter(r.propEq("isLeft", true), eitherArray)

    const isEmpty = r.propEq('length', 0)
    return (isEmpty(leftObjs)) ?
        Task.rejected(leftObjs) :
        Task.of(eitherArray)
}
4

1 回答 1

2

如果您只对捕获第一个Left值感兴趣,那么可以使用R.sequence将 a 转换为 a[Either a b]来定义它Either a [b]

R.pipe(R.sequence(Either.of), R.invoker(2, 'fold', Task.rejected, Task.of));

Validation可以使用类型,而不是Either组合所有Failure值,但是这需要Failure实现类型中的值Semigroup以允许组合它们。

为了捕获和拒绝所有Left值,我们可以以无点形式对您现有的实现进行建模,例如:

R.pipe(R.partition(R.prop('isLeft')),
       R.ifElse(R.pipe(R.head, R.isEmpty),
                R.pipe(R.last, Task.of),
                R.pipe(R.head, Task.rejected)));

这是否比您现有的实现更具可读性在很大程度上是主观的。

于 2015-12-20T21:23:26.740 回答