Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When are type signatures necessary in Haskell?

Tags:

Many introductory texts will tell you that in Haskell type signatures are "almost always" optional. Can anybody quantify the "almost" part?

As far as I can tell, the only time you need an explicit signature is to disambiguate type classes. (The canonical example being read . show.) Are there other cases I haven't thought of, or is this it?

(I'm aware that if you go beyond Haskell 2010 there are plenty for exceptions. For example, GHC will never infer rank-N types. But rank-N types are a language extension, not part of the official standard [yet].)

like image 879
MathematicalOrchid Avatar asked Nov 21 '14 18:11

MathematicalOrchid


People also ask

What is a type signature in Haskell?

From HaskellWiki. A type signature is a line like. inc :: Num a => a -> a. that tells, what is the type of a variable. In the example inc is the variable, Num a => is the context and a -> a is its type, namely a function type with the kind * -> * .

What does type do in Haskell?

In Haskell, every statement is considered as a mathematical expression and the category of this expression is called as a Type. You can say that "Type" is the data type of the expression used at compile time.

How does type determine in Haskell?

If you need to figure out what the type of an object is in a Haskell program, I hope this is helpful. Note that if you are in GHCI, you can just put :type before your expression to determine the expression's type, or use :set +t to see the type of every expression in GHCI.


1 Answers

Polymorphic recursion needs type annotations, in general.

f :: (a -> a) -> (a -> b) -> Int -> a -> b f f1 g n x =      if n == (0 :: Int)     then g x     else f f1 (\z h -> g (h z)) (n-1) x f1 

(Credit: Patrick Cousot)

Note how the recursive call looks badly typed (!): it calls itself with five arguments, despite f having only four! Then remember that b can be instantiated with c -> d, which causes an extra argument to appear.

The above contrived example computes

f f1 g n x = g (f1 (f1 (f1 ... (f1 x)))) 

where f1 is applied n times. Of course, there is a much simpler way to write an equivalent program.

like image 57
chi Avatar answered Dec 14 '22 16:12

chi