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)
尝试将我糊涂的脑袋包裹在 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)