我需要创建一个带有两个参数的函数,一个是
我可以很容易地使用列表推导式和列表递归来创建函数。但是,我需要使用以下这些参数:
我不知道如何阅读这个语法。正如Google告诉我的那样,
这让我出现了一个"The type signature for
Int
类型,另一个是 [Int]
类型,该函数返回一个新的 [Int]
数组,其中排除了第一个参数的所有出现次数。我可以很容易地使用列表推导式和列表递归来创建函数。但是,我需要使用以下这些参数:
deleteAll_list_comp :: Integer -> [Integer] -> [Integer]
deleteAll_list_rec :: (Integer -> Bool) -> [Integer] -> [Integer]
然而,我的任务要求的参数是
deleteAll_list_comp :: (Eq a) => a -> [a] -> [a]
deleteAll_list_rec :: (Eq a) => a -> [a] -> [a]
我不知道如何阅读这个语法。正如Google告诉我的那样,
(Eq a)
仅仅是告诉Haskell,a
是一种可比较的类型。然而,我不理解这有什么意义,因为所有的Int
都是自然可比较的。我该如何解释和使用这些参数来实现方法?我的意思是,这些参数到底是什么?
@groovy @pelotom
谢谢,这让我很清楚。我现在明白了,它只是要求两个参数而不是三个。然而,我仍然在运行这段代码时遇到了问题。
deleteAll_list_rec :: (Eq a) => a -> [a] -> [a]
delete_list_rec toDelete [] = []
delete_list_rec toDelete (a:as) =
if(toDelete == a) then delete_list_rec toDelete as
else a:(delete_list_rec toDelete as)
这让我出现了一个"The type signature for
deleteAll_list_rec
lacks an accompanying binding"的错误,这对我来说毫无意义,因为我已经正确地绑定了要求,不是吗?根据我的一点经验,(a:as)
被视为一个列表,同时从中提取第一个元素。为什么会产生错误呢?deleteAll_list_comp :: (Eq a) => a -> [a] -> [a]
deleteAll_list_comp toDelete ls = [x | x <- ls, toDelete==x]
不是吗?
2013年2月7日更新:对于那些未来可能遇到相同问题的人,我在这个链接中找到了一些关于Haskell的好信息,包括我的问题:http://learnyouahaskell.com/types-and-typeclasses
"有趣。我们在这里看到一个新事物,即 => 符号。=>符号之前的所有内容都被称为类约束。我们可以这样阅读先前的类型声明:等式函数接受任何两个相同类型的值,并返回一个布尔值。这两个值的类型必须是Eq类的成员(这是类约束)。
Eq类型类提供了一个测试相等性的接口。任何可以在该类型的两个值之间进行相等性测试的类型都应该是Eq类的成员。除了IO(用于处理输入和输出的类型)和函数之外,所有标准的Haskell类型都是Eq类型类的一部分。"
deleteAll_list_rec
,但在实现中却称其为delete_list_rec
。 - Daniel Fischer