Чтобы немного расширить ответ sepp2k: если вы попытаетесь скомпилировать следующее (или загрузить его в GHCi), вы получите ошибку:
import Data.List (sort)
f = head . sort
Это нарушение ограничения мономорфизма, потому что у нас есть ограничение класса (введено sort
), но нет явных аргументов: нам (несколько загадочно) сказали, что у нас Ambiguous type variable
в ограничении Ord a
.
Ваш пример (let x = 3
) имеет аналогично неоднозначную переменную типа, но она не выдает такую же ошибку, потому что она сохраняется по правилам "по умолчанию" Haskell :
Любые переменные мономорфного типа, которые
остаются, когда вывод типа для
Весь модуль завершен, являются
считаются неоднозначными и разрешаются
для определенных типов, используя
правила по умолчанию (раздел 4.3.4).
См. этот ответ для получения дополнительной информации о правилах по умолчанию. Важным моментом является то, что они работают только для определенных числовых классов, поэтому x = 3
хорошо, а f = sort
- нет.
В качестве примечания: если вы предпочитаете, чтобы x = 3
заканчивалось Int
вместо Integer
, а y = 3.0
было Rational
вместо Double
, вы можете использовать «декларация по умолчанию» для переопределения правил по умолчанию по умолчанию:
default (Int, Rational)