考虑这个例子:
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
时会抱怨。)答案 0 :(得分:14)
是的,you can,虽然它不像为每个类型类添加默认值那么简单,但它只适用于Num
及其Prelude
和标准库中的子类。语法为default (t1, ..., tn)
,每个模块只能使用一个这样的声明。
例如,添加default (Int)
会将代码中Integral
的默认值更改为Int
。
默认默认值(Integer, Double)
不仅仅是GHC政策:它来自Haskell 98 Report。 (GHCi确实有extended default rules。)
这是当前系统的一些问题的a discussion。