Difference between revisions of "Type signatures as good style"
(type inference not always decidable) |
(→Answer: link to type signature) |
||
Line 6: | Line 6: | ||
== Answer == |
== Answer == |
||
− | Using explicit type |
+ | Using explicit [[type signature]]s is good style and [[GHC]] with option <code>-Wall</code> warns about missing signatures. |
Signatures are a good documentation and not all Haskell program readers have a type inference algorithm built-in. |
Signatures are a good documentation and not all Haskell program readers have a type inference algorithm built-in. |
||
There are also some cases where the infered signature is too general for your purposes. |
There are also some cases where the infered signature is too general for your purposes. |
Revision as of 00:12, 30 December 2010
Question
Since Haskell type checkers can automatically derive types of expressions why shall I put explicit type signatures in my programs?
Answer
Using explicit type signatures is good style and GHC with option -Wall
warns about missing signatures.
Signatures are a good documentation and not all Haskell program readers have a type inference algorithm built-in.
There are also some cases where the infered signature is too general for your purposes.
E.g. the infered (most general) type for asTypeOf
is a -> b -> a
,
but the purpose of asTypeOf
is to unify the types of both operands.
The more special signature a -> a -> a
is what you want and it cannot be infered automatically.
Another example:
emptyString :: ShowS
emptyString = id
Where ShowS
is String -> String
rather than a -> a
.
Even more, for some type extensions the automatic inference fails,
e.g. the higher-order types used by Control.Monad.ST.runST
runST :: (forall s . ST s a) -> a
cannot be inferred in general, because the problem is undecidable. In GHC, they are enabled with the language pragma RankNTypes
.
How to add a bunch of signatures?
Ok, this convinced me. How can I add all the signatures I did not write so far?