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 имеет расширенные правила по умолчанию.)

Вот обсуждение некоторых проблем с существующей системой.

Другие вопросы по тегам