2016-12-08 2 views
1

Когда мы имеем выражение:Как работает функциональная композиция с несколькими аргументами (например, fmap. Fmap)?

(fmap . fmap) function nested_functor 

Я бы ожидать, что перевести на что-то вроде

fmap (fmap function nested_functor) 

Хотя это удивительно, кажется, ведут себя как

fmap (fmap function) nested_functor 

Почему?

+5

Все функции одного аргумента, то есть 'a-> b-> c' такое же, как' а -> (b-> с) '. Постройте отсюда. –

+5

... и поэтому 'f x y' совпадает с' (f x) y'. ('f :: a -> (b-> c)', 'x :: a',' y :: b') –

ответ

9

Ну, просто посмотрите на определение (.):

(f . g) x = f (g x) 

Так,

(fmap . fmap) function = fmap (fmap function) 

Добавление дополнительный аргумент в конце не меняет уравнение - просто делает его более конкретный.

(fmap . fmap) function nested_functor = fmap (fmap function) nested_functor 

(функция приложения NB левоассоциативно, поэтому f x y означает (f x) y.)

+0

Спасибо! Мое недоразумение состояло в том, что я подумал об этом, как если бы приложение-функция было бы правильным ассоциативным, и беспорядок был связан с тем, что (->), связанное с правом в типах подписей ... Мне теперь кажется смешным, что функциональное приложение в типе объявления имеют другую ассоциативность, чем в самих выражениях. –

+3

@PedroMorteRolo Это своего рода симметричный способ. С его установкой, как это, вы не можете иметь круглых скобок в приложении аргументов 'fn' to 'two' как' fn xy' и никаких скобок в соответствующей сигнатуре типа для 'fn :: Int -> Int -> Bool' (например). Если они связаны одинаковым образом (независимо от того, каким образом это происходит), одна из этих двух вещей потребует парнеров, а другая - нет. –

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