开发者

Haskell: Defaulting constraints to type

Consider this example:

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

The 3 in applyThrice is defaulted by GHC to an Integer as shown when compiling with -Wall:

Warning: Defaulting the following constraint(s) t开发者_开发知识库o type 'Integer'
         'Integral t'
           arising from a use of 'applyKTimes'

So I guess that Integer is the default Integral a => a.

  • Is there a way to define "default types" for other constraints too?
  • Is using default types bad practice? (it does complain when using -Wall..)


Yes, you can, although it's not quite so simple as adding a default per typeclass, and it only works for Num and its subclasses in the Prelude and standard libraries. The syntax is default (t1, ..., tn), and only one such declaration can be used per module.

Adding default (Int), for example, would change the default for Integral in your code to Int.

The default default of (Integer, Double) isn't just a GHC policy: it's from the Haskell 98 Report. (GHCi does have extended default rules, though.)

Here's a discussion of some of the problems with the current system.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜