条件函数的无点样式

问题描述 投票:1回答:1

我希望能以无缝的方式写一些这样的帮助。

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

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

在实践中,我会添加另一个链(在fork之前)来执行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)
}
javascript pointfree ramda.js
1个回答
2
投票

如果您只对捕获第一个Left值感兴趣,那么可以使用R.sequence定义,这将把[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)));

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

© www.soinside.com 2019 - 2024. All rights reserved.