Подтвердить что ты не робот

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..)
4b9b3361

Ответ 1

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

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

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

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