我想用Option代替Switch,我试过Alt.altAll
,效果很好:
function foo(a: number) {
return alt.altAll(O.Alt)<string>(O.none)([
O.fromPredicate(() => a >= 85)('A'),
O.fromPredicate(() => a >= 75)('B'),
O.fromPredicate(() => a >= 75)('C'),
O.some('D'),
])
}
但是它总是计算整个Option数组,而不是 short-circuiting,所以我想知道是否有一种方法可以实现下面这样的逻辑?谢谢!
// I don't want to use Option.alt because that would add one more level of nesting.
function foo(a: number) {
return alt.lazyAltAll(O.Alt)<string>(O.none)([
() => O.fromPredicate(() => a >= 85)('A'),
() => O.fromPredicate(() => a >= 75)('B'),
() => O.fromPredicate(() => a >= 75)('C'),
() => O.some('D'),
])
}
1条答案
按热度按时间rsaldnfx1#
如果你想实现一个类似于现有函数的函数,查看源代码会很有帮助,例如
altAll
。如果你只在
Option
上使用它,你只需要<F extends URIS>(F: Alt1<F>)
重载。其他重载是针对Either
这样的类型的,它有一个以上的类型参数。这样做是因为
F.alt
已经支持lazy second参数,所以可以使用O.Alt.alt(O.none, () => O.some(1))
作为例子。