You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:24:01