我有一個這種型別的串列:[(a, [a])]。例如:
[("a",["x","y"]),("x",["a","y"]),("z",[]),("y",["a","x"])]
我想過濾這個串列。過濾應該像這樣作業:
- 從第一個專案開始,從第一個元組遍歷專案
- 洗掉第一個元組中的鍵(因此洗掉
"x","y")
最終結果應該變成:
[("a",["x","y"]),("z",[])] -- the "x" and "y" are removed because they live in "a"
這個想法是獲取一個串列,然后Map.delete從import qualified Data.Map as Map該串列中申請。然而,當我被介紹時,我被困在了事情Maybe上。這是我的代碼:
import System.IO
import Data.Maybe as Maybe
import qualified Data.Map as Map
list = [("a",["x","y"]),("x",["a","y"]),("z",[]),("y",["a","x"])]
main :: IO ()
main = do
let myMap = Map.fromList list
let myList = funcA list myMap
print myList
funcA (x:xs) myMap
| f == Nothing = Nothing
-- | otherwise = f
-- | otherwise = funcC f myMap
| otherwise = Maybe.maybeToList f
where a = fst x
f = funcB a myMap
funcB key myMap = Map.lookup key myMap
funcC portion myMap = portion
你能幫我嗎?
- - - - - - - 編輯
回答后代碼如下所示:
import System.IO
import Data.Maybe as Maybe
import qualified Data.Map as Map
list = [("a",["x","y"]),("x",["a","y"]),("z",[]),("y",["a","x"])]
main :: IO ()
main = do
let myList = removeKeys list
print myList
removeKeys :: Eq a => [(a, [a])] -> [(a, [a])]
removeKeys [] = []
removeKeys (kv@(_, vs): kvs) = kv : removeKeys (filter ((`notElem` vs). fst) kvs)
輸出:
> runghc program
[("a",["x","y"]),("z",[])]
我喜歡回答的解決方案,因為使用了創造性的方式filter。它基本上是這樣做的:
Prelude> let vs = ["x","y"]
Prelude> let kvs = [("x",["a","y"]),("z",[]),("y",["a","x"])]
Prelude> filter ((`notElem` vs). fst) kvs
[("z",[])]
Prelude> let vs = ["a","y"]
Prelude> let kvs = [("z",[]),("y",["a","x"])]
Prelude> filter ((`notElem` vs). fst) kvs
[("z",[])]
Prelude> let vs = []
Prelude> let kvs = [("y",["a","x"])]
Prelude> filter ((`notElem` vs). fst) kvs
[("y",["a","x"])]
Prelude> let vs = ["a","x"]
Prelude> let kvs = []
Prelude> filter ((`notElem` vs). fst) kvs
[]
uj5u.com熱心網友回復:
您可以創建一個遞回函式,使用 2 元組的第二項中的專案過濾串列的其余部分,因此:
removeKeys :: Eq a => [(a, [a])] -> [(a, [a])]
removeKeys [] = []
removeKeys (kv@(_, vs): kvs) = kv : removeKeys (filter ((`notElem` vs). fst) kvs)
將不考慮已洗掉項的鍵值對中的值中的項。因此"x",例如,如果 has ("x", ["a", "y", "z"]),它將不會 remove "z",因為它位于已洗掉的專案中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/427243.html
標籤:哈斯克尔
