Haskell:默认约束类型

时间:2010-05-18 23:53:31

标签: haskell typeclass

考虑这个例子:

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时会抱怨。)

1 个答案:

答案 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