簡體   English   中英

如何從Haskell中的列表列表中提取元組

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

同樣,如果任何列表沒有兩個項目,程序將崩潰。

“安全”包中有安全版本的tailhttps://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.

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