Haskell旧教程Mult实例代码语法错误排查与修正咨询
解决Haskell单位一致性检查中Mult实例的语法与扩展问题
看起来你被旧教程里的笔误和过时的编译选项坑了,我来一步步帮你理清问题:
1. 先修正最明显的语法错误
原教程里的h1>完全是笔误——这应该是Haskell函数定义里的标准等号=。你修改后的代码也没搞对:类方法的定义必须用=来关联参数列表和返回值,不能直接把返回值写在参数后面。
2. 给出正确的Mult实例声明
假设你已经定义了Add类型类(用于Peano数的类型级加法)、Mult类型类,以及类型级列表构造器Cons,正确的实例代码应该是这样的:
-- 先确保启用必要的语言扩展(替代旧的废弃选项) {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE TypeOperators #-} -- 用于支持中缀形式的`Cons` -- 假设Peano数加法的类型类 class Add i j k where add :: i -> j -> k -- 单位乘法的类型类 class Mult r s t where mult :: r -> s -> t -- 类型级列表构造器(用反引号支持中缀写法) data a `Cons` r = Cons a r -- 递归处理非空单位列表的Mult实例 instance (Add i j k, Mult r s t) => Mult ((a, i) `Cons` r) ((a, j) `Cons` s) ((a, k) `Cons` t) where mult (Cons (a, i) r) (Cons (_, j) s) = Cons (a, add i j) (mult r s)
3. 替换废弃的编译选项
你提到的-fglasgow-exts和-fallow-undecidable-instances确实已经废弃,但在GHC 8.4.3里,你可以用更精准的语言扩展pragma替代:
-fglasgow-exts包含的核心功能可以拆分成MultiParamTypeClasses、FlexibleInstances等具体扩展-fallow-undecidable-instances直接替换为UndecidableInstances即可
这些扩展是必须的:
MultiParamTypeClasses:允许定义Mult这种多参数的类型类FlexibleInstances:允许实例头里出现非标准的类型结构(比如(a, i)Consr)UndecidableInstances:因为实例上下文里引用了Mult r s t,属于递归依赖,需要这个扩展允许GHC处理
4. 额外注意点
如果你的Cons是作为前缀类型构造器定义的,那值层面的构造函数也要对应使用前缀形式;如果是中缀类型运算符(比如很多教程里用:::代替Cons),代码会更直观,但核心逻辑是一致的。
另外,你还需要补充空单位列表的Mult实例作为递归的基准情况,比如:
instance Mult () () () where mult () () = ()
内容的提问来源于stack exchange,提问作者dim_voly
相关产品推荐
相关产品推荐

