Haskell: поиск типа выражения, включающего map - PullRequest
0 голосов
/ 09 июня 2019

Я пытаюсь найти тип следующего выражения Haskell:

map (\x -> x + 1)

Поскольку функция map применяется частично, она возвращает другую функцию.

В GHCI тип возвращаемой функции:

let res = map (\x -> x + 1)
:t res
map (\x -> x + 1) :: Num b => [b] -> [b]

Будет ли тип вышеприведенного выражения типом возвращаемой функции? Любые идеи приветствуются.

1 Ответ

2 голосов
/ 09 июня 2019

Да, это тип возвращаемой функции.

Но как GHC это выясняет?Хорошо, давайте посмотрим на тип просто map:

map :: (a -> b) -> [a] -> [b]

А теперь давайте посмотрим на тип \x -> x + 1:

(\x -> x + 1) :: Num n => n -> n

(на случай, если вы нееще не знаю, это означает, что он преобразует n в n, где n может быть любым типом, который является экземпляром Num, т.е. n является любым числовым типом.)

Таксопоставляя типы, мы получаем:

map           ::         (a -> b) -> [a] -> [b]
(\x -> x + 1) :: Num n => n -> n

Итак:

map (\x -> x + 1) :: Num n => [n] -> [n]

То же, что и отчет GHCi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...