考虑这个例子:
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
时确实会报错 ..) 最佳答案
是的,you can , 虽然它不像为每个类型类添加一个默认值那么简单,它只适用于 Num
Prelude
及其子类和标准库。语法是 default (t1, ..., tn)
,并且每个模块只能使用一个这样的声明。
添加 default (Int)
,例如,将更改 Integral
的默认值在您的代码中添加到 Int
.
默认的 (Integer, Double)
不仅仅是 GHC 政策:它来自 Haskell 98 Report . (不过,GHCi 确实有 extended default rules。)
这里是 a discussion当前系统的一些问题。
关于Haskell:默认约束类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2861988/