Haskell:因使用`=='而没有(Eq a)的实例在表达式中:(b == c)

时间:2014-04-27 22:18:20

标签: 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:       没有(Eq a)的实例         使用==' In the expression: (b == c) In an equation for esIgual'引起的:esIgual b c =(b == c)

我认为这与b和c相关的东西没有被认为是“Eq a”类型或类似的东西,但正如我所说,我在这里的婴儿步骤。有什么想法吗?

3 个答案:

答案 0 :(得分:6)

我没有得到type classes的解释(你应该阅读一些有关该问题的haskell教程),但基本的想法是,如你所说,为了使用函数{在==b ca类型==,您需要保证该类型的esIgual :: Eq a => a -> a -> Bool esIgual b c = (b == c) 函数的实现。在haskell中,我们称之为"类型约束"我们把它写成:

esIgual

请注意,您可能省略了esIgual b c = (b == c) 的类型注释,编译器会为您推断出它。尝试只写

:t esIgual

然后将文件加载到GHCI并输入:

elemento

您还需要在elemento :: Eq a => ... 中添加约束,因为它使用的是isIgual:

==

检查出来:http://learnyouahaskell.com/types-and-typeclasses#typeclasses-101 :)第一个例子正是关于{{1}}。

答案 1 :(得分:3)

esIgual目前承诺为同一类型Bool的任何两个对象返回a,对于什么类型没有任何要求。但是它使用==来执行此操作,==只有a的工作是Eq的实例,类型类允许您比较对象的相等性。该要求需要反映在esIgual的类型签名中,如:

esIgual :: Eq a => a -> a -> Bool

然后,这也需要传播到elemento

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

答案 2 :(得分:0)

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

esIgual :: Eq a => a -> a -> Bool
esIgual b c = (b == c)

否则,Haskell无法将==运算符应用于任意类型a

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