我在 Haskell 中使用兩個串列作為“集合”,我應該找到并回傳兩個串列的交集。我有從串列中洗掉重復項的措施,但是我想不出如何實際比較串列并獲得另一個僅包含兩個串列中都存在的元素的串列。這是我到目前為止所擁有的
intersect :: [Integer] -> [Integer] -> [Integer]
intersect [] _ = []
intersect _ [] = []
intersect (x:xs) L2 = filter (\x -> x 'elem' L2) L2
但是,這是不正確的,但從邏輯上講,我無法完全想到如何進行這項作業。任何想法和建議將不勝感激!此外,如果有人有任何不涉及匯入任何其他模塊的想法會更好,因為我只想依賴前奏中的功能。
uj5u.com熱心網友回復:
您應該使用 backtics 將函式用作中綴運算子,因此x `elem` L2. 此外,您在這里使用L2兩次(并且由于L2以大寫開頭,編譯器會認為這L2是一個資料建構式)。您應該使用另一個串列的專案過濾一個串列。Integer是一種型別,因此以大寫字符開頭。
如果我們因此解決了上述問題,我們得到:
intersect :: [Integer] -> [Integer] -> [Integer]
intersect [] _ = []
intersect _ [] = []
intersect xs ys = filter (\x -> x `elem` xs) ys
或更短:
intersect :: [Integer] -> [Integer] -> [Integer]
intersect [] = const []
intersect xs = filter (`elem` xs)
然而這些會不會,如果對作業xs是一個無限串列,并有至少一個專案ys是不是最終的產生的xs名單。可以使用對角化來最終產生出現在兩個串列中的所有專案。可以為此使用該control-monad-omega軟體包。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316853.html
