【发布时间】:2014-12-17 03:50:50
【问题描述】:
我想做的是获取一个元组列表,然后检查任何元组中的任何元素是否与 int 匹配。如果 int 匹配元组中的任一元素,则元组将添加到要返回的列表中。 一旦列表扫描了所有的元组,它将返回一个只匹配 int 的元组列表。
filter1 :: (a -> Bool) -> [(Int, Int)] -> [(Int, Int)]
filter1 _ [] = []
filter1 p (x:xs)
| p x = x : filter1 p xs
| otherwise = filter1 p xs
这是我目前所拥有的。唯一的问题是它在哪里重复我得到一个错误,因为我正在获取一个元组列表并将其放回一个应该只是一个 int 的地方。
【问题讨论】:
-
您在这里所做的只是重复了
filter的定义,但是您更改了类型签名。但是,您对类型签名的更改还不够。试试filter1 :: ((Int, Int) -> Bool) -> [(Int, Int)] -> [(Int, Int)]。 -
这里,每个
x都有(Int, Int)类型,并且您希望对其应用一个返回布尔值的函数。因此,您的p函数必须具有(Int, Int) -> Bool类型。filter :: (a -> Bool) -> [a] -> [a]的类型在这里说明。您获取as 的列表和从a到Bool的函数。在这里,您传递了(Int, Int)的列表,所以a是(Int, Int)。 -
@bheklilr 我已经尝试过了,但它对我不起作用
-
在什么情况下不起作用?你还说你得到了一个错误,但还没有说这个错误真的很容易。请发布您收到的错误消息的全文,GHC 的错误实际上通常非常有用并且有助于解决类型错误。
-
@Sprout
(5, 6)不是(Int, Int) -> Bool类型,而是(Int, Int)类型。你必须传递一个函数,而不仅仅是一个“东西”。采用Ints 元组的函数看起来如何?好吧,让我们看看==:==的类型为a -> a -> Bool,其中 a 必须是相等的。所以现在我们将==专门用于(Int, Int):(Int, Int) -> (Int, Int) -> Bool。但这是一个元组太多了。我们怎样才能摆脱它?我们可以部分申请==(如果需要,请查看,您需要)。
标签: list haskell recursion filter tuples