Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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) to 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..)
like image 563
yairchu Avatar asked May 18 '10 23:05

yairchu


1 Answers

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.

like image 146
Travis Brown Avatar answered Oct 09 '22 23:10

Travis Brown