Рассмотрим этот пример:
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
..)