F#中的嵌套monad绑定

问题描述 投票:0回答:1

试图将糊状的头缠在单子上并绑住

例如,仅以学习摘要为例,>

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,但即使是我应该查看的内容,我也不知道吗?

[试图将我的糊状头缠在单子上并绑住,以这个片段为例,纯粹是作为学习练习打开FSharpPlus打开FSharpPlus.Data让lowerBounds i =如果i> 10则...

f# monads f#+
1个回答
1
投票
您可以使用Kleisli组成:
© www.soinside.com 2019 - 2024. All rights reserved.