gpt4 book ai didi

javascript - 如何将 Either.Right 转移到 Either.Left?

转载 作者:行者123 更新时间:2023-12-01 03:38:30 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com