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

标签 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>

最佳答案

我认为这应该有效:

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/

相关文章:

.net - IClrTypeMapping 与 ClrTypeMappingDescriptor

jquery - jQuery 是一个 monad

java - 避免在 Java 8 stream reduce 方法中使用全局变量

function - Clojure:如何执行一系列函数?

inheritance - 参数多态性与子类型多态性 F#

excel - 使用 Excel 在 F# 中绘图

f# - 如何在 F# 中实现 "return early"逻辑

javascript - React router v4 - 使用 HOC 的授权路由

docker - 在使用 Paket 从项目构建的 Docker 镜像中找不到 Microsoft.AspNetCore.App 2.2.7

f# deedle 基于列键聚合行值