我正在使用 chessie 辅助函数库来执行 ROP(单子(monad))
https://github.com/fsprojects/Chessie/blob/master/src/Chessie/ErrorHandling.fs
但是我不确定如何将以下三个函数简洁地组合在一起。在哪里 twoInputFunc
仅当 func1 和 func2 返回成功时才应评估。
val func1 : int -> Result<Tp1, 'a>
val func2 : string -> Result<Tp2, 'a>
val twoInputFunc : par1:Tp1 -> Tpar2:Tp2 -> Result<Ta,'a>
最佳答案
我认为这应该有效:
let f x y = trial {
let! a = func1 x
let! b = func2 y
return! twoInputFunc a b}
这个想法是将每个结果绑定(bind)到
a
和 b
然后用作最后一个函数调用的输入。如果 func1 或 func2 导致错误,它将短路并返回错误。另一种方法是使用应用程序:
let g x y = flatten (twoInputFunc <!> func1 x <*> func2 y)
在这里,您以 Applicative 样式应用两个参数,但最终会得到一个 Result 的结果,因此您需要将其展平,这相当于 monad
join
手术。免责声明:我没有安装 Chessie,所以我没有尝试上面的代码,但我尝试了 FSharpPlus这对所有 monads(不仅仅是 Either)都是通用的,并且工作正常(使用
monad
而不是 trial
和 join
而不是 flatten
)。
关于F# 使用 monad (ROP) 来组合具有两个参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41607821/