[英]Filter along a list of tuples
我正在尝试解决代码出现的第 4 天,为此我目前需要过滤元组列表的列表。
首先,让我们来获取样本
sample=[[(2,4),(6,8)],[(2,3),(4,5)],[(5,7),(7,9)],[(2,8),(3,7)],[(6,6),(4,6)],[(2,6),(4,8)]]
此示例是使用Data.Text.splitOn
和一个简单的元组化 function (\[x,y] -> (x,y))
获得的。
然后,我们需要找到一个包含另一个的所有元组对。 然后,我编写了简单的以下帮助程序
contains :: (Int,Int) -> (Int,Int) -> Bool
contains a b = (fst a) <= (fst b) && (snd a) <= (snd b)
最后,我想从样本中filter
,但我不知道该怎么做。 当然,我使用map
将二维元组列表简化为简单的一维元组列表;
main :: IO ()
main = do
print $ length $ map solution sample
其中, solution
是
solution :: [(Int,Int)] -> [Bool]
solution = filter (\x y -> x `contains` y || y `contains` x)
出现以下错误
Couldn't match type ‘(Int, Int)’ with ‘Bool’
Expected: [(Int, Int)] -> [Bool]
Actual: [(Int, Int)] -> [(Int, Int)]
• In the expression:
filter (\ x y -> x `contains` y || y `contains` x)
要么
solution :: [(Int,Int)] -> [(Int,Int)]
solution = filter (\x y -> x `contains` y || y `contains` x)
出现以下错误
Couldn't match type ‘(Int, Int)’ with ‘Bool’
Expected: [(Int, Int)] -> [Bool]
Actual: [(Int, Int)] -> [(Int, Int)]
• In the expression:
filter (\ x y -> x `contains` y || y `contains` x)
要么
solution :: [(Int,Int)] -> [(Int,Int)]
solution = filter (\[x,y] -> x `contains` y || y `contains` x)
出现以下错误
• Couldn't match expected type: (Int, Int)
with actual type: [(Int, Int)]
• In the pattern: [x, y]
In the first argument of ‘filter’, namely
‘(\ [x, y] -> x `contains` y || y `contains` x)’
In the expression:
filter (\ [x, y] -> x `contains` y || y `contains` x)
ETC...
我尝试了我的学习大脑能想到的一切,这让我从最近几天开始发疯。 我究竟做错了什么?
我认为你的根本问题是你的数据表示。 您的 function contains
两个元组; 那部分可能不错。 (有点不清楚你定义的不等式是否正确,我不知道上下文。)但是你提取的sample
包含的项目都是元组列表; 不能保证长度。
我建议重新处理sample
以具有类型[((Int, Int), (Int, Int))]
。 我认为您可以从那里开始工作; 如果你再次陷入困境,你可以尝试uncurry
ing contains
(尽管你已经在进行模式匹配,所以你可以忽略它)。
(\xy ->...)
是一个带有两个参数的 lambda。 你没有那个,你只有一个元组参数。
(\[x, y] ->...)
更接近:它是一个 lambda 接受一个参数,一个列表预计正好有两个元素。 但这仍然不是二元组。
相反,您想要(\(x, y) ->...)
,一个 lambda 采用二元组参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.