[英]How to extract tuples from a list of lists in Haskell
我在Haskell中有以下列表
[
[("Name", "Alice"), ("Age", "21")],
[("Name", "Bob"), ("Age", "22")],
[("Name", "Eve"), ("Age", "20")]
]
我怎樣才能得到一個列表[...]
這樣的時代的:
[("Age", "21"), ("Age", "22"), ("Age", "20")]
我認為可以使用set comprehension完成,但我不確定。
好吧,我會給你一個答案,但首先請注意,你提供給我們的列表類型是不允許的....
每個列表中的第一個類型具有類型(String, String)
,第二個類型為Num a=>(String, a)
。 Haskell不允許混合列表。
話雖這么說,一旦你解決了這個問題(例如,將年齡元組改為("age", "2")
),你有幾個選擇:
如果您始終希望以“Age”開頭的元組中的值可以使用以下內容
map (lookup "Age") $ theList
這幾乎可以工作,但會返回類型[Maybe String]
。 您可以通過使用fromJust
刪除Just
,但要小心,如果程序不存在,這將使程序崩潰。 更fromMaybe
方法是使用fromMaybe
,它允許您在Nothing
情況下填寫默認值。
map (fromMaybe "ageless" . lookup "Age") $ theList
如果您總是想要列表中的第二個值,請使用
map (snd . tail) $ theList
同樣,如果任何列表沒有兩個項目,程序將崩潰。
“安全”包中有安全版本的tail
( https://hackage.haskell.org/package/safe-0.3.3/docs/Safe.html )。 例如,你可以使用
map (snd . tailDef ("", "Ageless")) $ theList
我能想到的最好的方式是這樣的:
getAges :: [[a]] -> [a]
getAges = map (!! 1)
這只是一個函數,它檢索第一個列表中每個子列表的第二個元素。 這應該適用於這種特殊情況,但是如果你想將元組與“Name”標簽相匹配,那就更難了:
getAges :: [[a]] -> [a]
getAges list = do
person <- list
tags <- person
get' tags
where get' (tag,val) | tag == "Age" = return (tag,val)
| otherwise = fail "Not age tag"
這將從嵌套數組中提取“Age”元組,而不會觸及Maybe
!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.