Haskell:默认约束类型

yai*_*chu 18 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
Run Code Online (Sandbox Code Playgroud)

3applyThrice通过GHC默认为一个Integer与编译时如图所示-Wall:

Warning: Defaulting the following constraint(s) to type 'Integer'
         'Integral t'
           arising from a use of 'applyKTimes'
Run Code Online (Sandbox Code Playgroud)

所以我猜这Integer是默认的Integral a => a.

  • 有没有办法为其他约束定义"默认类型"?
  • 使用默认类型不好的做法?(使用时确实抱怨-Wall..)

Tra*_*own 14

是的,你可以,虽然它不像添加每个类型类的默认值那么简单,它只适用NumPrelude和标准库中的子类.语法是default (t1, ..., tn),每个模块只能使用一个这样的声明.

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

默认默认值(Integer, Double)不仅仅是GHC策略:它来自Haskell 98报告.(但GHCi确实有扩展的默认规则.)

以下是对当前系统的一些问题的讨论.