Это частичное применение оператора композиции к самому составу.В общем, мы знаем, что если мы применим (.)
к некоторой функции f :: x -> y
, то
>>> :t (.) f
(.) f :: (a -> x) -> a -> y
из-за того, как типы выстраиваться:
(b -> c) -> (a -> b) -> a -> c
x -> y
--------------------------------
(a -> x) -> a -> y
Мы бросаем первый аргумент, и заменить остальные вхождения b
и c
с соответствующими типами данного аргумента.
Здесь f
всего лишь (.)
, что означает, что мы идентифицируем x ~ (b -> c)
и y ~ (a -> b) -> a -> c
. Подкладка типов снова
(a -> x ) -> a -> y
b -> c (a -> b) -> a -> c
Поскольку a
происходит на верхнем и нижний, мы должны выбрать новое переменное имя a
на дне; GHC выбрал a1
:
(a -> x ) -> a -> y
b -> c (a1 -> b) -> a1 -> c
Ввод двух вместе дает тип, который вы видите GHCi.
(a -> b -> c) -> a -> (a1 -> b) -> a1 -> c
Anatomy шутки в сторону, то, что является(.)(.)
?
Предположим, у вас есть функция f :: a -> b
, но вы хотите функцию g :: a -> c
, то есть вы хотите f
, но с другим типом возврата. Единственное, что вы можете сделать, это найти вспомогательную функцию h :: b -> c
, которая преобразует возвращаемое значение для вас. Ваша функция g
затем просто состав h
и f
:
g = h . f
Вы могли бы, однако, имеет более общую функцию h' :: t -> b -> c
, которые могут поворот значения типа b
в значение типа c
нескольких способов, в зависимости на значение некоторого аргумента x :: t
. Тогда вы можете получить много разных g
s в зависимости от этого аргумента.
g = (h' x) . f
Теперь, учитывая h'
, x
и f
, мы можем вернуть нашу g
, так что давайте напишем функцию, которая делает это: функция, которая «способствует» возвращаемое значение f
из значения типа b
к значение типа c
, учитывая функцию h'
и некоторое значение x
:
promote h' x f = (h' x) . f
Вы можете механически преобразовать любую функцию, чтобы указать, в свободной форме; Я не знаком с деталями, но с использованием PointFree.io производит
promote = ((.) .)
который является только частичным применением (.) (.)
написано в разделе, то есть:
((.) (.)) h' x f == (h' x) . f
Итак, наш оператор «сиськи» является просто обобщенный оператор предварительной компоновки.
Я думаю, что есть дубликат. Связанный https://stackoverflow.com/questions/16202289/haskell-function-composition-type-of-and-how-its-presented? Но на самом деле это не объясняет тип. – Zeta
Должно быть закрыто. Причина: Porn. – Damiano