Haskell:没有因使用`=';在表达式中:(b==c)

Haskell:没有因使用`=';在表达式中:(b==c),haskell,Haskell,所以,我是在haskell上迈出的第一步,在类中我被要求定义“elem”函数。这是我的第一个想法: elemento :: a -> [a] -> Bool elemento b listab = foldl (||) False (map (esIgual b) listab) esIgual :: a -> a -> Bool esIgual b c = (b == c) 结果是 elem(parcialito).hs:5:18: 没有(等式a)的实例 由于使用了

所以,我是在haskell上迈出的第一步,在类中我被要求定义“elem”函数。这是我的第一个想法:

elemento :: a -> [a] -> Bool
elemento b listab = foldl (||) False (map (esIgual b) listab)

esIgual :: a -> a -> Bool
esIgual b c = (b == c)
结果是

elem(parcialito).hs:5:18: 没有(等式a)的实例 由于使用了
=='
在表达式中:(b==c)
在
esIgual的方程式中:esIgual b c=(b==c)


我认为这与b和c不被认为是“Eq a”类型或类似的东西有关,但正如我所说的,我还处在初级阶段。有什么想法吗?

您需要声明
esIgual
以要求typeclass
Eq
中类型的参数:

esIgual :: Eq a => a -> a -> Bool
esIgual b c = (b == c)
否则,Haskell无法将
=
运算符应用于任意类型的
a


(或者,正如Aegis所指出的,完全跳过声明)

我不想解释(你应该阅读一些haskell教程来了解这一点),但基本思想是,正如你所说的,为了在
b
c
上使用函数
=
,这两种类型都是
a
,您需要确保该类型有一个
=
函数的实现。在haskell中,我们称之为“类型约束”,并将其写成:

esIgual :: Eq a => a -> a -> Bool
esIgual b c = (b == c)
请注意,您可以省略
esIgual
的类型注释,编译器会为您推断出它。尽量只写

esIgual b c = (b == c)
然后将文件加载到GHCI并键入:

:t esIgual
您还需要在
elemento
中添加一个约束,因为它使用的是isIgual:

elemento :: Eq a => ...

检查以下内容::)第一个示例正是关于
==

esIgual
当前承诺为同一类型的任何两个对象返回
Bool
,对其类型没有任何要求。但是它使用
=
来实现这一点,并且
=
仅适用于
a
Eq
的一个实例,该类型类允许您比较对象是否相等。该要求需要反映在
esIgual
的类型签名中,如:

esIgual :: Eq a => a -> a -> Bool
然后还需要传播到
elemento

elemento :: Eq a => a -> [a] -> Bool