Является ли "a -> b -> (a -> b -> c) -> c" для применения двух параметров стандартной функциональной концепцией?

Наткнулся на необходимость функции с подписью '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 отвечает всем требованиям, но я не могу избавиться от ощущения, что я мог бы использовать встроенную функцию или оператор или что мне не хватает более фундаментального способа сделать это (за исключением лямбд, которые, по-моему, в этом случае читаются хуже). Обратите внимание, что я не могу легко изменить порядок параметров myFun (это жираф HttpHandlerпоэтому последние два параметра должны быть HttpFunc а также HttpContext, обозначенный TypeA а также TypeB выше).

Это apply2 Функция с сигнатурой Я описал справедливую вещь для функционального программирования, или я упускаю что-то очевидное? Если это общеизвестная концепция, есть ли у нее лучшее название?

3 ответа

Решение

На мой взгляд, код намного понятнее, если связать промежуточное значение с 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

В вашем трубопроводе вы можете заменить:

 |> apply2 valueA valueB

с

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

Так ||> такой же, как ваш apply2 функция, но с аргументами

Вы могли бы использовать небольшую хитрость здесь:

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

или просто

let useCase someValue tuple =
    ...
Другие вопросы по тегам