[英]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.