Как это использование оператора композиции работает без второго аргумента? - PullRequest
4 голосов
/ 24 мая 2019

Я сталкивался с использованием.оператор, которого я не совсем понимаю.

Я сам пытался рассуждать об этом, но вывод, к которому я пришел, отличается от того, что производит GHCI.

Я использую :t для проверкитип выражения.

Я использую следующие функции: last и (.), которые имеют следующие подписи:

last :: [a] -> a
(.) :: (b -> c) -> (a -> b) -> a -> c

Функция, в которой я запутался,this:

(last .)

Я не уверен, что это за конструкция, но я предположил, что она будет похожа на композицию функций.Используя мои рассуждения, я ожидал, что это произведет следующую функцию:

(last .) :: (b -> [c]) -> (a -> b) -> a -> [c]

Что :t на самом деле дает мне это:

(last .) :: (a -> [c]) -> a -> c

1 Ответ

6 голосов
/ 24 мая 2019

Это пример секционирования инфиксного оператора [Haskell-wiki] :

(...)

(2^) (левая часть) эквивалентно (^) 2, или более многословно \x -> 2 ^ x.

Итак, мы здесь сконструировали функцию, которая выглядит следующим образом:

<b>\f -></b> last . <b>f</b>

или короче:

(.) last

Функция (.) :: (b -> c) -> (a -> b) -> a -> c принимает две функции g и h и создает функцию \x -> g (h x).Здесь g, таким образом, last.

Таким образом, мы создали функцию, которая принимает в качестве входных данных функцию f :: b -> [c], которая затем возвращает last . f.

...