问题 你如何在Haskell中允许GADT?


今天我开始从以下方面了解GADT: haskell.org 和 https://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>

这是我正在使用的代码:

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?


5085
2017-09-28 17:18


起源

使用编译器选项或编译指示。 downloads.haskell.org/~ghc/7.8.2/docs/html/users_guide/... - n.m.


答案:


Use GADTS to allow GADTS 看起来很疯狂

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

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

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

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


14
2017-09-28 17:24



该 {-# LANGUAGE GADTs #-} 方法几乎总是可行的方法,因为它让人们阅读源代码可以立即看到正在使用的扩展。 - dfeuer
@dfeuer我同意。实际上这就是为什么它更常见。 - Yuras
感谢您的帮助。 - maffh
还有选项 {-# OPTIONS_GHC -XGADTs #-},但那可读性较差,所以我选择了 LANUGAGE pragma默认也是。 - AJFarmar