f# - "a -> b -> (a -> b -> c) -> c"应用两个参数是标准函数概念吗?

标签 f# functional-programming pipeline partial-application pipelining

我发现需要一个带有签名 'a -> 'b -> ('a -> 'b -> 'c) -> 'c 的函数来应用两个管道传输时的参数:

let apply2 x y f =
  f x y

我需要这个,因为我正在使用一个函数

myFun : MyType -> TypeA -> TypeB -> ResultType

我在另一个函数中使用它,如下所示:

let useCase someValue (valueA: TypeA) (valueB: TypeB) =
  someValue
  |> ...
  |> toMyType
  |> myFun
  |> apply2 valueA valueB

apply2 符合要求,但我无法摆脱这样的感觉:我可以使用内置函数或运算符,或者我缺少一些更基本的方法来执行此操作(除了 lambdas,恕我直言,在这种情况下读起来更糟)。请注意,我无法轻松切换 myFun 的参数顺序(它是一个 Giraffe HttpHandler,因此最后两个参数必须是 HttpFuncHttpContext,由上面的TypeATypeB指定)。

具有我所描述的签名的 apply2 函数是否适合在函数式编程中使用,或者我是否遗漏了一些明显的东西?如果这是一个众所周知的概念,是否有更好的名称?

最佳答案

在我看来,如果使用 let 绑定(bind)中间值,代码会更清晰。

let useCase someValue (valueA: TypeA) (valueB: TypeB) =
    let myValue =
        someValue
        |> ...
        |> toMyType
    myFun myValue valueA valueB

您还可以使用向后管道,如下所示

let useCase someValue (valueA: TypeA) (valueB: TypeB) =
    someValue
    |> ...
    |> toMyType
    |> myFun <| valueA <| valueB

关于f# - "a -> b -> (a -> b -> c) -> c"应用两个参数是标准函数概念吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50148135/

相关文章:

java - 有效地使用 Netty 管道

python - "Piping"使用 Python 中缀语法从一个函数输出到另一个函数

当初始化程序具有依赖性时,F# XUnit 测试死锁

c# - OleDb 连接打开时出现 SEHException

functional-programming - Rust 中的函数式编程是零成本的吗?

scala - 如何将字符串分割成等长的子串?

f# - 定义委托(delegate)

f# - 将逗号分隔的字符串列表转换为整数列表

Haskell: (+1) 和 (\x->x+1) 有什么区别?

groovy - 用于处理给定目录中所有文件的 Nextflow 脚本