F#要么monad(ROP)要用两个参数组成函数

Chi*_*ble 4 f# functional-programming

我使用辅助函数的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>
Run Code Online (Sandbox Code Playgroud)

Gus*_*Gus 10

我认为这应该有效:

let f x y = trial {
    let! a = func1 x
    let! b = func2 y
    return! twoInputFunc a b}
Run Code Online (Sandbox Code Playgroud)

我们的想法是,你每个结果绑定到ab,然后被用作一个函数调用输入.如果func1或func2导致错误,它将短路并返回错误.

另一种方法是使用applicatives:

let g x y = flatten (twoInputFunc <!> func1 x <*> func2 y)
Run Code Online (Sandbox Code Playgroud)

在这里,您在Applicative样式中应用两个参数,但最终会得到Result of Result,因此您需要将其展平,这相当于monad join操作.

免责声明:我没有安装切西所以我没有试过上面的代码,但我试图与FSharpPlus这是通用于所有的单子(不只是其一),它(使用正常工作monad,而不是trialjoin代替flatten).