gpt4 book ai didi

F# 使用 monad (ROP) 来组合具有两个参数的函数

转载 作者:行者123 更新时间:2023-12-04 22:42:35 25 4
gpt4 key购买 nike

我正在使用 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)到 ab然后用作最后一个函数调用的输入。如果 func1 或 func2 导致错误,它将短路并返回错误。

另一种方法是使用应用程序:
let g x y = flatten (twoInputFunc <!> func1 x <*> func2 y)

在这里,您以 Applicative 样式应用两个参数,但最终会得到一个 Result 的结果,因此您需要将其展平,这相当于 monad join手术。

免责声明:我没有安装 Chessie,所以我没有尝试上面的代码,但我尝试了 FSharpPlus这对所有 monads(不仅仅是 Either)都是通用的,并且工作正常(使用 monad 而不是 trialjoin 而不是 flatten )。

关于F# 使用 monad (ROP) 来组合具有两个参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41607821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com