Является ли "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 =
...