2015-09-28 14 views
9

Dzisiaj zacząłem się uczyć o GADT od: haskell.org i https://wiki.haskell.orgJak zezwolić na GADT w Haskell?

Niestety, nie wiem jak z nich korzystać. Jeśli uruchomić kod z przykładu I pojawia się następujący błąd:

[1 of 1] Compiling Main    (test.hs, interpreted) 

AFP_229.hs:31:1: 
Illegal generalised algebraic data declaration for `Term' 
    (Use GADTs to allow GADTs) 
In the data declaration for `Term' 
Failed, modules loaded: none. 
Prelude> 

Jest to kod używam:

data Term a where 
    Lit :: Int -> Term Int 
    Succ :: Term Int -> Term Int 
    IsZero :: Term Int -> Term Bool 
    If  :: Term Bool -> Term a -> Term a -> Term a 
    Pair :: Term a -> Term b -> Term (a,b) 

Próbowałem inny kod przykładowy, ale to daje mi ten sam błąd . Jak zezwolić na GADT?

+2

Użyj opcji kompilatora lub pragmy. https://downloads.haskell.org/~ghc/7.8.2/docs/html/users_guide/ghc-language-features.html#options-language –

Odpowiedz

10

Use GADTS to allow GADTS wygląda dzikie :)

Zasadniczo istnieją dwa sposoby, aby włączyć rozszerzenia językowych:

  • ścieżka -X<extensions> do ghc, na przykład ghc -XGADTS

  • umieścić {-# LANGUAGE <extension> #-} u góry pliku, np. {-# LANGUAGE GADTs #-}

Początkowo komunikaty o błędach wyglądał tak: Use -XGADTs to allow GADTs, ale faktycznie Pragma język (drugi sposób) jest bardziej powszechne, a ludzie zaczęli narzekać, że trudno jest skopiować-n-wklej nazwę przedłużacz z błędem wiadomość, więc -X został usunięty.

+8

Podejście "{- # LANGUAGE GADTs # -}" prawie zawsze jest to droga, ponieważ pozwala ludziom czytającym źródło natychmiast zobaczyć, jakie rozszerzenia są w grze. – dfeuer

+0

@dfeuer Zgadzam się. W rzeczywistości dlatego jest bardziej powszechne. – Yuras

+0

Dziękuję za pomoc. – maffh

Powiązane problemy