F# 中的嵌套 monad 绑定



试图将我的糊状头包裹在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)

相关内容

  • 没有找到相关文章

最新更新