《Associated Types with Class》论文代码编译失败:笔误还是语言演进?
《Associated Types with Class》论文代码编译问题分析
你遇到的问题确实是论文的语法表述疏漏,而非Haskell关联类型的核心语义发生了大幅变更。2004年关联类型还处于提案阶段,论文中可能使用了简化的语法表述,和如今GHC实现的标准语法存在差异。
代码问题拆解
- 类型类定义本身是合法的:
class C a where data T a (b :: * -> *)
这里T是关联数据类型,对于每个C a实例,T a是一个接受*->*类型参数的构造器(kind为(*->*)->*),必须传入一个b才能得到具体类型(kind为*)。
- 实例定义的错误点:
论文中的实例代码:
instance C a => C [a] where data T [a] b = D [T a] (b a)
报错原因是[T a]中的T a缺少了必要的b参数——T a需要一个*->*类型的参数才能成为具体类型,所以正确写法应该是[T a b],修改后编译器就能通过。
D类型签名的问题:
论文给出的签名:
D :: C a => [T a] -> (b a) -> T [a]
同样是省略了必要的类型参数,正确的签名应该是:
D :: C a => [T a b] -> (b a) -> T [a] b
这属于论文为了表述简洁而省略参数的写法,不符合当前GHC的语法要求。
获取论文勘误的渠道
- 查看论文发表的会议/期刊官方页面,部分会提供勘误板块;
- 检索论文的DOI对应的学术数据库页面,部分论文会附带用户或作者提交的勘误;
- 访问论文作者的个人主页,很多学者会在此发布论文的修正版或勘误说明;
- 直接联系论文的通讯作者,询问是否有官方勘误文档。
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

