试图将我的糊状头包裹在monads和绑定上
以这个片段为例,纯粹作为学习练习
open FSharpPlus
open FSharpPlus.Data
let lowerBounds i =
if i > 10 then
Ok i
else
Error "i was <= 10"
let upperBounds i =
if i < 20 then
Ok i
else
Error "i was >= 20"
let even i =
if i % 2 = 0 then
Ok i
else
Error "i was uneven"
let rebind validation x = x >>= validation |> Seq.singleton
seq{10..20} |> Seq.map lowerBounds
>>= rebind upperBounds
>>= rebind even
虽然这执行,但我不喜欢rebind
函数,因为它不是通用的,并且与Seq.singleton
绑定,更不用说我看不出如何让它自由点(但这是一个次要的.....点(
现在我知道我可以传入依赖项,或者完全重构事物并编写验证函数,但我试图学习如何绑定到嵌套的 monad。(类似于递归>>=
中缀运算符的东西??感觉这将是更FPish的方法?
如您所见,我正在使用FSharpPlus,并且我看了一下monad变压器部分,但我不知道即使这是否是我应该关注的?
您可以使用 Kleisli 组合:
seq{10..20} |> Seq.map ( lowerBounds >=> upperBounds >=> even)