作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
db.findUser(id).then(R.pipe(
R.ifElse(firstTestHere, Either.Right, () => Either.Left(err)),
R.map(R.ifElse(secondTestHere, obj => obj, () => Either.Left(err))),
console.log
))
如果第一个测试没有通过,它将返回 Either.Left,并且第二个测试不会被调用。它将输出:
_Right {值:用户}
但是如果第一个通过了,但第二个没有通过,就会变成:
_Right {值:_Left {值:错误}}
我希望它只输出_Left {value: err},如何修复代码或者有什么方法可以将右转移到左吗?
最佳答案
您注意到 map
无法将两个 Either
实例“压平”在一起。为此,您需要使用 chain
相反。
db.findUser(id).then(R.pipe(
R.ifElse(firstTestHere, Either.Right, () => Either.Left(err)),
R.chain(R.ifElse(secondTestHere, Either.Right, () => Either.Left(err))),
console.log
))
这种将一系列调用组合在一起的模式也可以通过composeK
来实现。/pipeK
,其中要组合的每个函数必须采用 Monad m => a -> m b
的形式,即从 a 生成一些 monad(例如 Either
)的函数给定值。
使用R.pipeK
,您的示例可以修改为:
// helper function to wrap up the `ifElse` logic
const assertThat = (predicate, error) =>
R.ifElse(predicate, Either.Right, _ => Either.Left(error))
const result = db.findUser(id).then(R.pipeK(
assertThat(firstTestHere, err),
assertThat(secondTestHere, err)
));
关于javascript - 如何将 Either.Right 转移到 Either.Left?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44073615/
我是一名优秀的程序员,十分优秀!