2016-04-10 131 views
2

我試圖將元組列表映射到元組的不同列表中,但沒有運氣。Haskell將元組列表映射到元組列表

示例輸入:

a = [("eo","th"),("or","he")] 

輸出示例:

[('e','t'),('o','h'),('o','h'),('r','e')] 

我曾嘗試:

map (\(a,b) -> (a!!0,b!!0):(a!!1,b!!1):[]) a 

但它產生:

[[('e','t'),('o','h')],[('o','h'),('r','e')]] 

回答

3

您必須對您的結果使用concat或使用concatMap而不是map。畢竟,你在地圖中返回列表,因此得到一個列表清單。


讓我們給你的函數的名稱和類型:

magic :: [([Char], [Char])] -> [(Char, Char)] 

現在,我們可以認爲這是一個兩步的過程:從每對在我們打算到原始列表獲取列表:

magicPair :: ([Char], [Char]) -> [(Char, Char)] 
magicPair (a,b) = zip a b 

現在我們需要在原始列表地圖magicPair以上所有元素並連接所有的結果:

magic xs = concat (map magicPair xs) 

結合concat . map f是如此普遍,有一個叫concatMap這個功能:

magic xs = concatMap magicPair xs 

並採用一對,而不是兩個參數的函數f也很常見,所以magicPair = uncurry zip

magic xs = concatMap (uncurry zip) xs 

我們現在可以刪除兩邊的xs,最終變爲magic的最後一個變體:

magic = concatMap (uncurry zip) 
1

這裏是一個快速的方式,讓你的輸出

simplify = (>>= uncurry zip) 
+2

這是完全針對任何語言初學者混淆。 – Zeta

+1

@Zeta - ....這會誘使他們想要更多地瞭解Haskell是多麼的酷。 – jamshidh