Как я могу поменять порядок приложений в определенной функции F#?
Учитывая общую функцию f:a->b->c
Я хочу создать функцию, которая делает то же самое / вычисление, что и f, но с изменением порядка двух входных параметров (или порядка каррирования).
Итак, ищу g:b->a->c
где g
выполняет те же вычисления, что и f
==
let transform1 (f:a->b->c) : (b->a->c) =
?
3 ответа
Решение
По типу функции вы можете сказать, как это сделать.
transform1
имеет тип (a -> b -> c) -> (b -> a -> c)
или, что эквивалентно, (a -> b -> c) -> b -> a -> c
,
Так что вы ищете, это функция, которая принимает
- функция
a -> b -> c
который мы назовемf
, - и
b
, - и
a
, - а затем "использует"
f
сa
иb
для того, чтобы произвестиc
,
Так как есть только один способ "использовать" f
с a
и b
который производит c
Вы пишете так вниз:
flip f b a = f a b
и это все.
Вы можете определить swap
функционировать таким образом:
let swap f a b = f b a
В Haskell вы бы сделали это так:
g b a = f a b -- or using lambda expressions: (\b a -> f a b)
Так что в let
заявление: let g = (\b a -> f a b) in ...