Как я могу поменять порядок приложений в определенной функции 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 ...

Другие вопросы по тегам