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. (Хотя GHCi имеет расширенные правила по умолчанию.)
Вот обсуждение некоторых проблем с существующей системой.