我遇到了一个带有签名'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
(它是长颈鹿HttpHandler
的参数顺序,因此最后两个参数必须为HttpFunc
和{{1} },由上面的HttpContext
和TypeA
指定。
带有签名的TypeB
函数是否描述了在函数式编程中使用的公平的东西,还是我错过了一些明显的东西?如果这是一个众所周知的概念,它有更好的名称吗?
答案 0 :(得分:5)
在我看来,如果将中间值与let
绑定,代码会更清晰。
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
答案 1 :(得分:3)
在您的管道中,您可以替换:
|> apply2 valueA valueB
与
|> (||>) (valueA, valueA)
因此||>
与您的apply2
函数相同,但使用了tupled参数。
答案 2 :(得分:2)
你可以在这里使用一个小技巧:
let useCase someValue ((valueA, valueB) as tuple) =
someValue
|> ...
|> toMyType
|> myFun
<|| tuple
或只是
let useCase someValue tuple =
...