Haskell: ограничения по умолчанию для типа
Рассмотрим следующий пример:
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
..)
Ответы
Ответ 1
Да, вы можете, хотя это не так просто, как добавление по умолчанию для каждого класса, и оно работает только для Num
и его подклассы в Prelude
и стандартных библиотеках. Синтаксис default (t1, ..., tn)
, и только одно такое объявление может использоваться для каждого модуля.
Добавление default (Int)
, например, изменит значение по умолчанию для Integral
в вашем коде на Int
.
Значение по умолчанию (Integer, Double)
по умолчанию не является политикой GHC: оно из Haskell 98 Report. (Однако GHCi имеет расширенные правила по умолчанию.
Здесь обсуждение некоторых проблем с текущей системой.