你如何在Haskell中允许GADT?

maf*_*ffh 13 haskell gadt

今天我开始从以下网站了解GADT:haskell.orghttps://wiki.haskell.org

不幸的是,我不知道如何使用它们.如果我运行示例中的代码,我会收到以下错误:

[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>
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的代码:

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)
Run Code Online (Sandbox Code Playgroud)

我尝试了其他示例代码,但这给了我同样的错误.你如何允许GADT?

Yur*_*ras 19

Use GADTS to allow GADTS外观野生:)

基本上有两种方法可以启用语言扩展:

  • 路径-X<extensions>ghc,如ghc -XGADTS

  • 放在{-# LANGUAGE <extension> #-}文件的顶部,例如{-# LANGUAGE GADTs #-}

最初的错误消息看起来像:Use -XGADTs to allow GADTs但实际上语言编译指示(第二种方式)更常见,人们开始抱怨很难从错误消息中复制粘贴扩展名,因此-X被删除.

  • `{ - #LANGUAGE GADTs# - }`方法几乎总是可以采用的方法,因为它让人们在阅读源代码时可以立即看到正在使用的扩展. (8认同)