2016-12-19 2 views
2

У меня есть функция, которая просто переключает порядок двух аргументов для любой функции F, как так:Каким будет тип функции, которая переключает порядок аргументов?

flippingArguments f a b = f b a 

когда я проверяю тип flippingArguments с: т, я получаю следующее:

flippingArguments :: (t -> t1 -> t2) -> t1 -> t -> t2 

который я не понимаю. Я бы предсказал следующее (что неправильно):

flippingArguments :: (t -> t1 -> t2) -> t -> t2 -> t1 

Возможно, я непонимание, как читать спецификацию типа в Haskell? Я понимаю, что первые круглые скобки (t -> t1 -> t2) представляют аргументы flippingArguments, где t - f, t1 - a, t2 - b, а следующие три t -> t2 -> t1 - flippingArguments return значения, где просто порядок t1 и t2 перевернут. Но это неправильно.

Я прихожу из Java, поэтому простите меня, если я не понимаю, каково здесь значение возврата, его, вероятно, довольно рудиментарный материал. Чтобы повторить, может ли кто-нибудь объяснить мне типовое обозначение flippingArguments?

+0

'flippingArguments' преобразует функцию fuction' a -> b -> c' в функцию 'b -> a -> c'. Тип '(t -> t1 -> t2) -> t1 -> t -> t2' эквивалентен с (t -> t1 -> t2) -> (t1 -> t -> t2)'. – freestyle

+0

't2' - это тип _return_ входной функции, а не один из аргументов; это не будет аргументом в функции результата. –

ответ

9

следующий могут помочь:

flippingArguments :: (t -> t1 -> t2) -> t1 -> t -> t2 
flippingArguments f     a  b = f b a 

У нас есть, что первый аргумент имеет тип f(t -> t1 -> t2), т.е. это бинарная функция, принимающую два аргумента типа t и t1 и возвращает значение типа t2.

Затем второй аргумент a имеет тип t1.

Затем третий аргумент b имеет тип t.

И, наконец, результат flippingArguments f a b имеет тип t2.


Более самоочевидной реализация может быть:

flippingArguments :: (t -> t1 -> t2) -> (t1 -> t -> t2) 
flippingArguments f    = \a  b -> f b a 

Здесь мы имеем, что есть только один аргумент f, с тем же типом, что и выше. В результате получается лямбда, которая принимает в качестве входных данных a и b и дает ожидаемый результат.

Несмотря на различный синтаксис, нет разницы между этим вариантом и первой реализацией. Действительно, благодаря currying нет никакой разницы между функцией, принимающей три аргумента f,a,b и возвращающей значение типа t2, а функция принимает только один аргумент f и возвращает функциональное значение типа t1->t->t2.

Смежные вопросы