【发布时间】:2021-12-26 22:18:29
【问题描述】:
我一直在尝试为函数实现一个实例 Eq,但我不断收到语法错误,并且无法在任何地方找到它应该是的。如果对于每个输入,函数都抛出相同的输出,则该函数是相等的。所以我试着检查每个输入并检查结果是否相等。
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 f2 _) (Fkt f1 _) = f2 I == f1 I && f2 II == f1 II && f2 III == f1 III &&
f2 IV == f1 IV && f2 V == f1 V && f2 VI == f1 VI && f2 VII == f1 VII && f2 VIII == f1 VIII &&
f2 IX == f1 IX && f2 X == f1 X && f2 N == f1 N && f2 F == f1 F
【问题讨论】:
-
两个问题:在您的模式匹配中,
Fkt只有一个参数,但您匹配两个。 (去掉f2和f1之后的下划线)。第二:缩进。确保Eq声明中的第 3 行和第 4 行向右缩进一点。但更重要的是,有更好的方法来写你想要的:让你的数据类型实例为Enum和Bounded,然后你就可以做到and [f1 x == f2 x | x <- [minBound .. maxBound]] -
@alias 对,但是列表推导不返回布尔列表吗?我只想要一个布尔值,对吧?
-
请注意对结果的调用
and。and [...],它结合了所有的布尔值。 -
@PramoxLol:列表推导确实返回了
Bools 的列表,但and函数会将其转换为单个Bool:True如果列表中的所有Bools 均为True,否则为False。
标签: haskell syntax functional-programming