Ну, мы можем сначала преобразовать конструктор данных (:)
и оператор функции (.) :: (b -> c) -> (a -> b) -> a -> c
в качестве лямбда-выражения:
(:) -> (\x y -> (x:y))
(.) -> (\f g t -> f (g t))
означает, что (:)(.)
- это сокращение от:
(\x y -> (x:y)) (\f g t -> f (g t))
Так что теперь мы можем заменить x
на лямбда-выражение:
\y -> (\f g t -> f (g t)) : y
Таким образом, функция равна ((.) :)
:частичный «минус», где нам все еще нужно заполнить хвост, а голова - это оператор точки.
Таким образом, тип представляет собой список функций с той же сигнатурой, что и оператор точки [(b -> c) -> (a -> b) -> a -> c]
.
Если мы, например, таким образом примем в качестве аргумента []
, мы построим список singleton (список с ровно одним элементом): оператор точки.