【问题标题】:Is "a -> b -> (a -> b -> c) -> c" to apply two parameters a standard functional concept?“a -> b -> (a -> b -> c) -> c” 应用两个参数是标准功能概念吗?
【发布时间】:2018-10-13 08:38:16
【问题描述】:

我发现需要一个带有签名 '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,所以最后两个参数必须是HttpFuncHttpContext,由上面的TypeATypeB指定) .

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

【问题讨论】:

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


    【解决方案1】:

    在我看来,如果将中间值与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
    

    【讨论】:

    • 接受建议只使用一个简单的中间值可能更具可读性(除了建议一种管道它的方法)。至于实际的管道语法,其他答案也有很好的建议。
    • 请注意,使用这样的反向管道运算符可能会令人困惑,因为很难辨别最后一行中实际发生的情况。 Don Syme(F# 的创建者)建议在使用该运算符时要谨慎,并且出于这个原因,切勿在与正向管道相同的代码行中使用它。
    • @TeaDrivenDev 我绝对不会推荐第二种解决方案。我添加它主要是因为我认为它仍然比使用 (||>) 或 的其他答案中的解决方案更清晰
    【解决方案2】:

    你可以在这里使用一个小技巧:

    let useCase someValue ((valueA, valueB) as tuple) =
        someValue
        |>  ...
        |>  toMyType
        |>  myFun
        <|| tuple
    

    或者只是

    let useCase someValue tuple =
        ...
    

    【讨论】:

      【解决方案3】:

      在您的管道中,您可以替换:

       |> apply2 valueA valueB
      

       |> (||>) (valueA, valueA)
      

      所以||&gt; 与您的apply2 函数相同,但带有元组参数。

      【讨论】:

        猜你喜欢
        • 2017-04-19
        • 2011-08-01
        • 1970-01-01
        • 2011-06-13
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多