F# 中的嵌套 monad 绑定

Nested monad binding in F#

尝试将我糊涂的脑袋包裹在 monad 和绑定中

以本段为例,纯属学习练习

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 transformer section,但我不知道那是否是我应该查看的内容?

您可以使用克莱斯利作文:

seq{10..20} |> Seq.map ( lowerBounds >=> upperBounds >=> even)