Как мне написать (:) (.) В точечной форме? - PullRequest
0 голосов
/ 26 мая 2018

Мне трудно понять, что делает функция (:)(.) в haskell.Может ли кто-нибудь помочь мне написать это в форме и объяснить шаг за шагом, как туда добраться?Первым шагом было бы расширить (:) так, чтобы мы получили ((.) :), но затем я застрял.
Это должно быть типа [(b->c)->(a->b)->a->c]->[(b->c)->(a->b)->a->c], но это не помогает мне, просто заставляет меня дажеболее запутанный.

Ответы [ 2 ]

0 голосов
/ 26 мая 2018
(:) (.)

Этап-расширение:

\x -> (:) (.) x

Преобразование в инфиксную запись:

\x -> (.) : x

То есть x должен быть списком, и мы добавляем (.) кэто (это то, что делает :: он добавляет элемент в список).

(.) - это функция, поэтому x должен быть списком функций.

(.) :: (b -> c) -> (a -> b) -> a -> c

, поэтому x должен иметь тип

x   :: [(b -> c) -> (a -> b) -> a -> c]
0 голосов
/ 26 мая 2018

Ну, мы можем сначала преобразовать конструктор данных (:) и оператор функции (.) :: (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 (список с ровно одним элементом): оператор точки.

...