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 :

Antworten auf die Frage(2)

Ihre Antwort auf die Frage