如何在Hugs中使用GADT

时间:2012-06-22 14:19:33

标签: haskell functional-programming ghc gadt hugs

我想编写一个Haskell程序,它在GHCi不支持的平台上交互使用GADT(即mipsel上的GNU / Linux)。问题是,可用于在GHC中定义GADT的构造,例如:

data Term a where
    Lit :: Int ->  Term Int
    Pair :: Term a -> Term b -> Term (a,b)
    ...

似乎对Hugs不起作用。

  1. GADT真的不能在Hugs中定义吗?我在Haskell课上的TA表示在Hugs中有可能,但他似乎不确定。
  2. 如果没有,可以使用Hugs支持的其他语法或语义对GADT进行编码,就像GADT可以用ocaml编码一样吗?

2 个答案:

答案 0 :(得分:7)

GADT没有在Hugs中实现。

相反,如果您尝试使用GADT运行代码,则应使用a port of GHC to mips。请注意,由于在更奇特的架构上缺少字节码加载,您将无法在所有平台上使用ghci。

答案 1 :(得分:4)

关于你的问题2(如何在Haskell 98中编码GADT用例),你可能想看看Sulzmann和Wang撰写的2006年论文:GADTless programming in Haskell 98

与您所指的OCaml工作一样,这通过将GADT通过相等类型进行分解来实现。有多种方法可以定义相等类型;他们使用像OCaml一样的Leibniz等式,允许通过类型* -> *的类型运算符的任何应用程序替换。

取决于给定类型检查器关于GADT等式的原因,这可能不足以涵盖GADT的所有示例:检查器可以实现不一定由该定义捕获的等式推理规则。例如,a*b = c*d隐含a = cb = d:如果您只在类* -> *处应用类型构造函数,则不会出现这种形式的分解。在2010年晚些时候,Oleg discussed如何使用类型族通过Leibniz等式应用“类型解构器”,获得此定义的分解属性 - 但当然这也是在Haskell 98之外。

对于类型系统设计者来说,这是需要记住的:你的语言是否完整用于leibniz的平等,从某种意义上说它可以表达一个专门的平等解决者可以做什么?

即使您发现具有足够表达力的相等类型的编码,您也会遇到非常实际的便利问题:当您使用GADT时,所有对相同见证的使用都是从类型注释中推断出来的。使用这种显式编码,您还有很多工作要做。

最后(没有双关语),GADT的许多用例可以由tagless-final embeddings(同样由Oleg)同等地表达,IIRC通常可以在Haskell 98中完成。blog post by Martin Van Steenbergen在答复的评论中指出了这一点,但Oleg已大大改进了这项技术。