Haskell: ограничения по умолчанию для типа - PullRequest
18 голосов
/ 19 мая 2010

Рассмотрим этот пример:

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

GHC по умолчанию 3 в applyThrice принимает значение 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 Ответ

14 голосов
/ 19 мая 2010

Да, вы можете , хотя это не так просто, как добавить значение по умолчанию для каждого класса типов, и работает только для Num и его подклассов в Prelude и стандартных библиотеках. Синтаксис default (t1, ..., tn), и для каждого модуля можно использовать только одно такое объявление.

Добавление default (Int), например, изменит значение по умолчанию для Integral в вашем коде на Int.

Значение по умолчанию (Integer, Double) - это не просто политика GHC: это из отчета Haskell 98 . (Однако GHCi имеет расширенные правила по умолчанию .)

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

...