所以,即时通讯我在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”类型或类似的东西,但正如我所说,我在这里的婴儿步骤。有什么想法吗?
答案 0 :(得分:6)
我没有得到type classes的解释(你应该阅读一些有关该问题的haskell教程),但基本的想法是,如你所说,为了使用函数{在==
和b
c
上a
类型==
,您需要保证该类型的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所指出的,只是完全跳过声明)