嗨,我正在做一個小任務,但我是 haskell 的新手,需要一些幫助。
我有一個 [[(String, Int)]] ,它看起來像這樣:
race :: [[(String, Int)]]
race = [[("Verstappen",25),("Perez",18),("Leclerc",15),("Russell",12),("Sainz",10),("Hamilton",8),("Norris",6),("Ocon",4),("Alonso",2),("Bottas",1),("Vettel",0),("Ricciardo",0),("Gasly",0),("Magnussen",0),("Stroll",0),("Schumacher",0),("Tsunoda",0),("Zhou",0),("Albon",0),("Latifi",0)]
,[("Verstappen",25),("Perez",18),("Leclerc",15),("Ocon",12),("Hamilton",10),("Vettel",8),("Alonso",6),("Russell",4),("Latifi",2),("Norris",1),("Ricciardo",0),("Stroll",0),("Tsunoda",0),("Magnussen",0),("Bottas",0),("Zhou",0),("Schumacher",0),("Gasly",0),("Sainz",0),("Albon",0)]
,[("Perez",25),("Verstappen",18),("Leclerc",15),("Russell",12),("Sainz",10),("Hamilton",8),("Norris",6),("Ocon",4),("Alonso",2),("Bottas",1),("Vettel",0),("Ricciardo",0),("Gasly",0),("Magnussen",0),("Stroll",0),("Schumacher",0),("Tsunoda",0),("Zhou",0),("Albon",0),("Latifi",0)]]
這是3場比賽的結果。我需要根據名稱計算所有點并根據點對它們進行排序。最后它必須是純的[String]。我試圖通過模式匹配來做到這一點,但我迷路了,所以如果你能幫助我,我將不勝感激。
uj5u.com熱心網友回復:
這是一個申請的好Data.List.sortBy地方Data.List.groupBy。
要展平串列串列,您可以使用串列推導。
[y | x <- race, y <- x]
-- [("Verstappen",25),("Perez",18),("Leclerc",15),("Russell",12),("Sainz",10),("Hamilton",8),("Norris",6),("Ocon",4),("Alonso",2),("Bottas",1),("Vettel",0),("Ricciardo",0),("Gasly",0),("Magnussen",0),("Stroll",0),("Schumacher",0),("Tsunoda",0),("Zhou",0),("Albon",0),("Latifi",0),("Verstappen",25),("Perez",18),("Leclerc",15),("Ocon",12),("Hamilton",10),("Vettel",8),("Alonso",6),("Russell",4),("Latifi",2),("Norris",1),("Ricciardo",0),("Stroll",0),("Tsunoda",0),("Magnussen",0),("Bottas",0),("Zhou",0),("Schumacher",0),("Gasly",0),("Sainz",0),("Albon",0),("Perez",25),("Verstappen",18),("Leclerc",15),("Russell",12),("Sainz",10),("Hamilton",8),("Norris",6),("Ocon",4),("Alonso",2),("Bottas",1),("Vettel",0),("Ricciardo",0),("Gasly",0),("Magnussen",0),("Stroll",0),("Schumacher",0),("Tsunoda",0),("Zhou",0),("Albon",0),("Latifi",0)]
我們可以通過它來sortBy按名稱對它們進行排序。
sortBy (\(a,_) (b,_) -> a `compare` b) [y | x <- race, y <- x]
-- [("Albon",0),("Albon",0),("Albon",0),("Alonso",2),("Alonso",6),("Alonso",2),("Bottas",1),("Bottas",0),("Bottas",1),("Gasly",0),("Gasly",0),("Gasly",0),("Hamilton",8),("Hamilton",10),("Hamilton",8),("Latifi",0),("Latifi",2),("Latifi",0),("Leclerc",15),("Leclerc",15),("Leclerc",15),("Magnussen",0),("Magnussen",0),("Magnussen",0),("Norris",6),("Norris",1),("Norris",6),("Ocon",4),("Ocon",12),("Ocon",4),("Perez",18),("Perez",18),("Perez",25),("Ricciardo",0),("Ricciardo",0),("Ricciardo",0),("Russell",12),("Russell",4),("Russell",12),("Sainz",10),("Sainz",0),("Sainz",10),("Schumacher",0),("Schumacher",0),("Schumacher",0),("Stroll",0),("Stroll",0),("Stroll",0),("Tsunoda",0),("Tsunoda",0),("Tsunoda",0),("Verstappen",25),("Verstappen",25),("Verstappen",18),("Vettel",0),("Vettel",8),("Vettel",0),("Zhou",0),("Zhou",0),("Zhou",0)]
然后groupBy。
groupBy (\(a,_) (b,_) -> a == b) $ sortBy (\(a,_) (b,_) -> a `compare` b) [y | x <- race, y <- x]
-- [[("Albon",0),("Albon",0),("Albon",0)],[("Alonso",2),("Alonso",6),("Alonso",2)],[("Bottas",1),("Bottas",0),("Bottas",1)],[("Gasly",0),("Gasly",0),("Gasly",0)],[("Hamilton",8),("Hamilton",10),("Hamilton",8)],[("Latifi",0),("Latifi",2),("Latifi",0)],[("Leclerc",15),("Leclerc",15),("Leclerc",15)],[("Magnussen",0),("Magnussen",0),("Magnussen",0)],[("Norris",6),("Norris",1),("Norris",6)],[("Ocon",4),("Ocon",12),("Ocon",4)],[("Perez",18),("Perez",18),("Perez",25)],[("Ricciardo",0),("Ricciardo",0),("Ricciardo",0)],[("Russell",12),("Russell",4),("Russell",12)],[("Sainz",10),("Sainz",0),("Sainz",10)],[("Schumacher",0),("Schumacher",0),("Schumacher",0)],[("Stroll",0),("Stroll",0),("Stroll",0)],[("Tsunoda",0),("Tsunoda",0),("Tsunoda",0)],[("Verstappen",25),("Verstappen",25),("Verstappen",18)],[("Vettel",0),("Vettel",8),("Vettel",0)],[("Zhou",0),("Zhou",0),("Zhou",0)]]
從那里,您可以根據名稱和分數總和為每個結果創建一個元組。
[(fst $ lst !! 0, sum $ map snd lst) | lst <- groupBy (\(a,_) (b,_) -> a == b) $ sortBy (\(a,_) (b,_) -> a `compare` b) [y | x <- race, y <- x]]
-- [("Albon",0),("Alonso",10),("Bottas",2),("Gasly",0),("Hamilton",26),("Latifi",2),("Leclerc",45),("Magnussen",0),("Norris",13),("Ocon",20),("Perez",61),("Ricciardo",0),("Russell",28),("Sainz",20),("Schumacher",0),("Stroll",0),("Tsunoda",0),("Verstappen",68),("Vettel",8),("Zhou",0)]
正如評論中所指出的,sortOn和groupOn函式在Data.List.Extra很大程度上清理了代碼。
同樣,concat可用于展平串列串列。
groupOn fst $ sortOn fst $ concat race
操作這些資料并進一步格式化它留給讀者作為練習。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517116.html
標籤:哈斯克尔
上一篇:檢查矩陣是否至少有一列和一行
