Haskell: Defaulting constraints to type
haskell, typeclass
Solution
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.
Problem
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`..)