Ошибка возникает при выводе типа вашего утверждения.
С
(+1)
относится к типу Num a => a -> a
2
относится к типу Num a => a
map
относится к типу (a -> b) -> [a] -> [b]
Мы знаем, что map (+1)
должно быть типа (Num b) => [b] -> [b]
и, следовательно, map (+1) 2
типа (Num b, Num [b]) => [b]
. Но [b]
— это не просто переменная типа, это список некоторой переменной типа, где список — это конструктор данных. В альтернативной версии Haskell, где не существует синтаксического сахара для списков, мы могли бы написать (Num b, Num (List b))
.
Это проблема, потому что по умолчанию Haskell не поддерживает аргументы, не зависящие от типа, для ограничений. Таким образом, истинная природа проблемы не в том, что Haskell не знает, как отображать числа, а в том, что он не допускает значений типа, который создает наш вызов функции.
Но это правило не является строго необходимым. Добавляя -XFlexibleContexts
при вызове ghci, теперь разрешены типы, которые производит наш метод. Причина этого в том, что литерал 2
в Haskell на самом деле не представляет число — он представляет объект типа Num a => a
, который создается из интеграла 2
с использованием fromIntegral
. Таким образом, оператор map (+1) 2
эквивалентен map (+1) (fromIntegral (2::Integer))
. Это означает, что литерал "2" может представлять что угодно, при условии надлежащего инстанцирования, включая списки.
person
Nearoo
schedule
15.03.2020
(->)
, а не[]
, но проблема примерно так же). - person duplode   schedule 15.03.2020