Если вы пишете 1
, он имеет любой возможный тип номера .Вот что на самом деле означает Num p => p
.
Если вы используете 1
в выражении, GHCi попытается определить правильный тип числа для использования, основываясь на том, какие функции вы вызываете, и затемавтоматически присваивает 1
правильный тип.
Если GHCi не может угадать, какой правильный тип (из-за недостаточного контекста или из-за того, что подходит несколько типов), он по умолчанию принимает Integer
,(И для 1.0
по умолчанию он будет Double
. А для любого другого ограничения типа он попытается по умолчанию установить ()
, если это возможно.)
Это похоже на работу скомпилированного кода.Если вы напишите число в исходном коде, GHC (компилятор) попытается автоматически определить, каким должен быть правильный тип.Разница в том, что если компилятор не может понять это, он не будет"догадываться" или "по умолчанию", он просто выдаст вам ошибку времени компиляции итребовать, чтобы вы указали, что вы имеете в виду.Желательно, чтобы скомпилированный код работал так, как вы ожидали, но он утомителен для интерактивного тестирования, поэтому GHCi имеет значения по умолчанию.
Тип одиночного символа всегда Char
.
Тип строки: всегда String
или [Char]
.(Один является псевдонимом другого.)
Тип True
и False
равен всегда Bool
.И так далее.
Так что только на самом деле числа могут иметь несколько типов.
[Ну, есть возможность сделать строки полиморфными, но сейчас мы не будем об этом беспокоиться....]
Если вам нужны подробности, вы можете прочитать Отчет о языке Haskell (который является официальным документом спецификации, определяющим язык Haskell) и руководство пользователя GHCi (которое описывает, что делает GHCi).