Type Inferenz mit GADTs - a0 ist unantastbar
Sagen wir, ich habe dieses Programm
{-# LANGUAGE GADTs #-}
data My a where
A :: Int -> My Int
B :: Char -> My Char
main :: IO ()
main = do
let x = undefined :: My a
case x of
A v -> print v
-- print x
compiles fein.
Aber wenn ich im @ Kommentprint x
, Ich bekomme
gadt.hs: line 13, column 12:
Couldn't match type ‘a0’ with ‘()’
‘a0’ is untouchable
inside the constraints (a1 ~ GHC.Types.Int)
bound by a pattern with constructor
Main.A :: GHC.Types.Int -> Main.My GHC.Types.Int,
in a case alternative
at /home/niklas/src/hs/gadt-binary.hs:13:5-7
Expected type: GHC.Types.IO a0
Actual type: GHC.Types.IO ()
In the expression: System.IO.print v
In a case alternative: Main.A v -> System.IO.print v
Warum erhalte ich diesen Fehler in Zeile 13 A v -> print v
) statt nur imprint x
Linie
Ich dachte, das erste Vorkommen sollte den Typ bestimmen.
Bitte erleuchte mich :