[Haskell-cafe] phantom types
TP
paratribulations at free.fr
Fri Aug 17 11:35:35 CEST 2012
Hi,
I am currently reading documentation on Generalized Algebraic Data Types:
http://en.wikibooks.org/wiki/Haskell/GADT
I have a question concerning this page. Let us consider the following code
proposed in the page:
----------------------------------
-- Phantom type variable a (does not appear in any Expr: it is just a
-- dummy variable).
data Expr a = I Int
| B Bool
| Add (Expr a) (Expr a)
| Mul (Expr a) (Expr a)
| Eq (Expr a) (Expr a)
deriving (Show)
-- Smart constructors
add :: Expr Int -> Expr Int -> Expr Int
add = Add
i :: Int -> Expr Int
i = I
b :: Bool -> Expr Bool
b = B
eval :: Expr a -> a
eval (I n) = n
----------------------------------
I obtain the following error:
Phantom.hs:27:14:
Couldn't match type `a' with `Int'
`a' is a rigid type variable bound by
the type signature for eval :: Expr a -> a at Phantom.hs:27:1
In the expression: n
In an equation for `eval': eval (I n) = n
The wiki page explains:
"""
But alas, this does not work: how would the compiler know that encountering
the constructor I means that a = Int?
"""
I don't understand. When we write "eval (I n) = n", as I is a constructor
which takes an Int as argument, we are able to deduce that the type of n is
Int; so the type of eval should be in this case "Expr Int -> Int".
What do I miss?
Thanks,
TP
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20120817/1b9b2748/attachment.htm>
More information about the Haskell-Cafe
mailing list