是" a - > b - > (a - > b - > c) - > C"将两个参数应用为标准功能概念?

时间:2018-05-03 06:17:29

标签: 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(它是长颈鹿HttpHandler的参数顺序,因此最后两个参数必须为HttpFunc和{{1} },由上面的HttpContextTypeA指定。

带有签名的TypeB函数是否描述了在函数式编程中使用的公平的东西,还是我错过了一些明显的东西?如果这是一个众所周知的概念,它有更好的名称吗?

3 个答案:

答案 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 =
    ...