我使用辅助函数的chessie库来做ROP(monad) https://github.com/fsprojects/Chessie/blob/master/src/Chessie/ErrorHandling.fs
但是我不确定如何简洁地将以下三个功能组合在一起.其中twoInputFunc
应该只有FUNC1和FUNC2返回成功进行评估.
val func1 : int -> Resultval func2 : string -> Result val twoInputFunc : par1:Tp1 -> Tpar2:Tp2 -> Result
Gus.. 10
我认为这应该有效:
let f x y = trial { let! a = func1 x let! b = func2 y return! twoInputFunc a b}
我们的想法是,你每个结果绑定到a
和b
,然后被用作一个函数调用输入.如果func1或func2导致错误,它将短路并返回错误.
另一种方法是使用applicatives:
let g x y = flatten (twoInputFunc func1 x <*> func2 y)
在这里,您在Applicative样式中应用两个参数,但最终会得到Result of Result,因此您需要将其展平,这相当于monad join
操作.
免责声明:我没有安装切西所以我没有试过上面的代码,但我试图与FSharpPlus这是通用于所有的单子(不只是其一),它(使用正常工作monad
,而不是trial
和join
代替flatten
).
我认为这应该有效:
let f x y = trial { let! a = func1 x let! b = func2 y return! twoInputFunc a b}
我们的想法是,你每个结果绑定到a
和b
,然后被用作一个函数调用输入.如果func1或func2导致错误,它将短路并返回错误.
另一种方法是使用applicatives:
let g x y = flatten (twoInputFunc func1 x <*> func2 y)
在这里,您在Applicative样式中应用两个参数,但最终会得到Result of Result,因此您需要将其展平,这相当于monad join
操作.
免责声明:我没有安装切西所以我没有试过上面的代码,但我试图与FSharpPlus这是通用于所有的单子(不只是其一),它(使用正常工作monad
,而不是trial
和join
代替flatten
).