Рассмотрите этот пример:
applyKTimes :: Integral i => i -> (a -> a) -> a -> a
applyKTimes 0 _ x = x
applyKTimes k f x = applyKTimes (k-1) f (f x)
applyThrice :: (a -> a) -> a -> a
applyThrice = applyKTimes 3
3
в applyThrice
принят значение по умолчанию GHC к Integer
как показано при компиляции с -Wall
:
Warning: Defaulting the following constraint(s) to type 'Integer'
'Integral t'
arising from a use of 'applyKTimes'
Таким образом, я предполагаю это Integer
значение по умолчанию Integral a => a
.
-Wall
..) Да, вы можете , хотя это не так просто, как добавление значения по умолчанию для каждого класса типов, и работает только для Num
и его подклассов в Prelude
и стандартные библиотеки. Синтаксис default (t1, ..., tn)
, и только одно такое объявление может использоваться для каждого модуля.
Добавление по умолчанию (Int)
, например, изменит значение по умолчанию для Integral
в вашем коде на Int
.
Значение по умолчанию (Integer, Double)
- это не просто политика GHC: это из отчета Haskell 98 Report . (GHCi действительно имеет расширенные правила по умолчанию .)
Вот обсуждение некоторых проблем с текущей системой.