Haskell函数相等性判断:实现自定义函数类型Eq实例遇语法错误
错误原因
- 模式匹配参数不匹配:你定义的
Funktion是单字段newtype,构造器Fkt只接受1个函数类型参数,你在写(==)的模式匹配时多加了一个占位符_,写成了(Fkt f2 _),属于参数数量不匹配的语法错误。 - 换行缩进错误:
==的定义拆成多行后,后续行没有加缩进,Haskell会将无缩进的行识别为新的顶层声明,触发语法报错。
正确实现方案
修正原有写法
直接调整模式匹配和缩进即可运行:
newtype Funktion = Fkt { f :: Zahlraum_0_10 -> Zahlraum_0_10 } data Zahlraum_0_10 = N | I | II | III | IV | V | VI | VII | VIII | IX | X | F deriving (Eq,Ord,Show) instance Eq Funktion where (==) (Fkt f1) (Fkt f2) = f1 I == f2 I && f1 II == f2 II && f1 III == f2 III && f1 IV == f2 IV && f1 V == f2 V && f1 VI == f2 VI && f1 VII == f2 VII && f1 VIII == f2 VIII && f1 IX == f2 IX && f1 X == f2 X && f1 N == f2 N && f1 F == f2 F
更简洁的优化写法
给Zahlraum_0_10派生Enum和Bounded类型类,自动枚举所有取值做比对,避免手动罗列所有枚举值:
newtype Funktion = Fkt { f :: Zahlraum_0_10 -> Zahlraum_0_10 } data Zahlraum_0_10 = N | I | II | III | IV | V | VI | VII | VIII | IX | X | F deriving (Eq, Ord, Show, Enum, Bounded) instance Eq Funktion where (==) (Fkt f1) (Fkt f2) = all (\x -> f1 x == f2 x) [minBound .. maxBound]
内容的提问来源于stack exchange,提问作者Pramox Lol
相关产品推荐
相关产品推荐

