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..)
18
задан yairchu 18 May 2010 в 23:53
поделиться

1 ответ

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

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

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

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

14
ответ дан 30 November 2019 в 09:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: