Haskell 你怎么允许哈斯凯尔的GADT?

Haskell 你怎么允许哈斯凯尔的GADT?,haskell,gadt,Haskell,Gadt,今天,我开始从以下方面了解GADT:和 不幸的是,我不知道如何使用它们。如果运行示例中的代码,则会出现以下错误: [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

今天,我开始从以下方面了解GADT:和

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

[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>
这是我正在使用的代码:

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)

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

使用GADT允许GADT的
看起来很疯狂:)

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

  • 路径a
    -X
    ghc
    ,例如
    ghc-XGADTS

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


最初,错误消息看起来是这样的:
使用-XGADTs来允许GADTs
,但实际上语言pragma(第二种方式)更常见,人们开始抱怨很难从错误消息中复制-n-paste扩展名,因此
-X
被删除。

使用编译器选项或pragma。
{-#LANGUAGE GADTs#-}
方法通常是可行的,因为它可以让阅读源代码的人立即看到正在使用的扩展。@dfeuer我同意。事实上,这就是为什么它更常见。谢谢你的帮助。还有
{-#OPTIONS\u GHC-XGADTs#-}
选项,但可读性较差,所以默认情况下我也会使用
LANUGAGE
pragma。