基本上我想要做的是:給定一個由元組[(x,[y])]和另一個字串串列組成的串列[a],我想創建一個新串列,其中包含所有[y]'s wherex == a如果這有意義,所以如果我有[('a', ['z', 'k', 'x']), ('b', ['z']), ('c', ['y', 'j'])]and ['a', 'c'],當兩者都有時結果串列串列是通過函式傳遞的[['z', 'k', 'x'], ['y', 'j']]。
我想出的解決方案有點荒謬且過于復雜,(以及非功能性)但只是為了讓您可以看到我一直在考慮什么樣的路徑,我將在下面發布。
foo ys xs acc = map (\x -> (map (\(a,y) -> if x == a then y:acc else []) ys)) xs
這會列印出我想要的內容,但也會列印出大量額外的括號,這使得輸出非常混亂,毫無疑問,因為我已經將 map 函式混為一談了。有什么建議?
uj5u.com熱心網友回復:
給定
l1 = [('a', ['z', 'k', 'x']), ('b', ['z']), ('c', ['y', 'j'])]
l2 = ['a', 'c']
一個快速直觀的解決方案是
filter (\(c,_) -> c `elem` l2) l1
過濾器l1只保留那些第一個元素是element 的對l2。
過濾謂詞(\(c,_) -> c `elem` l2)也可以寫成((`elem` l2) . fst)。
至于性能,如果l2sorted 和l1相對于fsts 排序的事實只是對示例的巧合或過度簡化,我們可以觀察到filtering 是線性運算,因為您必須遍歷 to 的所有l1元素決定是否必須保留或過濾掉每一個。 `elem` l2但是也許可以通過制作l2a來改進由操作的查找Set,只需將其更改 `elem` l2為 即可 `elem` Data.Set.fromList l2。
相反,如果串列確實像示例中那樣排序,那么其他方法也是可能的。舉個例子,如果l1是和上面一樣,但是l2是['d', {-whatever-}],那么你就會知道輸出是空的。
uj5u.com熱心網友回復:
假設這兩個串列已排序,就像在您的示例中一樣,那么您可以使用模式匹配和守衛同時遍歷??兩個串列:
foo ((x,y):xs) (z:zs) | x == z =
foo ((x,_):xs) (z:zs) | x < z =
foo ((x,y):xs) (z:zs) | x > z =
foo [] _ =
foo _ [] =
我故意在=標志之后將所有內容都空白,因為我相信如果你自己填寫它,你會比我傾倒解決方案學到更多。雖然我確實留下了一個小提示,包括y在需要它的地方,而_不是在不需要它的地方。
測驗:
ghci> foo [('a', ['z', 'k', 'x']), ('b', ['z']), ('c', ['y', 'j'])] ['a', 'c']
["zkx","yj"]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/432682.html
上一篇:如何在Haskell中合并兩棵樹
下一篇:在Haskell中過濾元組串列
