我发现需要一个带有签名 '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
,因此最后两个参数必须是 HttpFunc
和HttpContext
,由上面的TypeA
和TypeB
指定)。
具有我所描述的签名的 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/