当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《F#要么monad(ROP)要用两个参数组成函数》经验,为你挑选了1个好方法。

我使用辅助函数的chessie库来做ROP(monad) https://github.com/fsprojects/Chessie/blob/master/src/Chessie/ErrorHandling.fs

但是我不确定如何简洁地将以下三个功能组合在一起.其中twoInputFunc应该只有FUNC1和FUNC2返回成功进行评估.

val func1 : int -> Result
val 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}

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

另一种方法是使用applicatives:

let g x y = flatten (twoInputFunc  func1 x <*> func2 y)

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

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



1> Gus..:

我认为这应该有效:

let f x y = trial {
    let! a = func1 x
    let! b = func2 y
    return! twoInputFunc a b}

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

另一种方法是使用applicatives:

let g x y = flatten (twoInputFunc  func1 x <*> func2 y)

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

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

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有