您如何在 Haskell 中允许 GADT?
How do you allow GADTs in Haskell?
今天我开始学习 GADTs 来自:haskell.org and 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?
Use GADTS to allow GADTS
看起来很疯狂 :)
基本上有两种启用语言扩展的方法:
路径 -X<extensions>
到 ghc
,例如ghc -XGADTS
将 {-# LANGUAGE <extension> #-}
放在文件的顶部,例如{-# LANGUAGE GADTs #-}
最初错误消息看起来像这样:Use -XGADTs to allow GADTs
,但实际上语言 pragma(第二种方式)更常见,人们开始抱怨很难从错误消息,因此 -X
被丢弃。
今天我开始学习 GADTs 来自:haskell.org and 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?
Use GADTS to allow GADTS
看起来很疯狂 :)
基本上有两种启用语言扩展的方法:
路径
-X<extensions>
到ghc
,例如ghc -XGADTS
将
{-# LANGUAGE <extension> #-}
放在文件的顶部,例如{-# LANGUAGE GADTs #-}
最初错误消息看起来像这样:Use -XGADTs to allow GADTs
,但实际上语言 pragma(第二种方式)更常见,人们开始抱怨很难从错误消息,因此 -X
被丢弃。