2010-05-18 43 views
18

考虑这个例子: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 

applyThrice3由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时抱怨..)

回答

14

是,you can,虽然它不是向每一个类型类默认这么简单,它仅适用于Num及其子类在Prelude和标准库。语法为default (t1, ..., tn),每个模块只能使用一个这样的声明。

例如,将default (Int)添加到您的代码中会将Integral的默认值更改为Int

缺省默认值(Integer, Double)不仅仅是GHC策略:它来自Haskell 98 Report。 (虽然GHCi确实有extended default rules

这里是a discussion的一些与当前系统有关的问题。