[英]Haskell List Comprehension and Pattern Matching
我正在尋找一個函數,它給我一個字母的所有匹配數字,例如giveNumber "D" [("D", 5), ("A", 4) ("D", 25)] = [5,25]
giveNumber :: String -> [(String, a)] -> [a]
giveNumber letter (x:xs) = [snd x | x <- xs | fst x == letter]
我收到一個解析器錯誤。
您不需要模式匹配或列表推導式,因為我認為使用 filter 和 map 會更容易:
giveNumber :: (Eq a) => [(a, b)] -> [b]
giveNumber x ys = map snd $ filter ((== x) . fst) ys
雖然您可以通過對代碼進行一些小的調整來做到這一點:
giveNumber letter xs = [snd x | x <- xs, fst x == letter]
這對您來說可能更有意義,但兩者的執行時間大致相同。 你做錯的是你有一秒鍾|
理解中需要逗號的符號,並且您不需要模式匹配(x:xs)
作為參數,因為x <- xs
循環遍歷所有xs
。
或者,你可以更簡單地做
giveNumber letter xs = [y | (x, y) <- xs, x == letter]
在這三個選項中,這個可能是最易讀和最容易理解的,但我最喜歡第一個,因為它都是由高階函數組成的,可以簡化為 eta
giveNumber x = map snd . filter ((== x) . fst))
使ys
參數隱式。
您可能還對內置的lookup
功能感興趣:
lookup :: Eq a => a -> [(a, b)] -> Maybe b
但這只會查找單個元素,可能會失敗。
你有兩個小錯誤:
1) 你在[("D", 5), ("A", 4) , ("D", 25)]
錯過了昏迷
2) 在你使用的列表理解中|
兩次,不是一次
giveNumber letter xs = [snd x | x <- xs , fst x == letter]
你可以寫得更漂亮一點:
giveNumber letter xs = [y | (x,y) <- xs , x == letter]
順便說一下,這個函數比String -> [(String, a)] -> [a]
更通用:
giveNumber :: Eq a => a -> [(a, t)] -> [t]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.