簡體   English   中英

Haskell 列表理解和模式匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM