2017-05-04 215 views
1

元組功能我具備的功能哈斯克爾

getCode :: [(a, Int)] -> [a] 
getCode = concatMap (uncurry replicate)` 

我希望

getCode [(‘a’,4),(‘b’,1),(‘a’,3),(‘b’,1)] 

輸出

「aaaabaaab」 

相反,我得到一個錯誤,它不匹配與預期數據類型[(a,Int)],實際數據類型爲[(Int,a)]。我如何改變它使其工作?或者其他方式?

回答

1

可以與flip功能互換的replicate的參數:

flip :: (a -> b -> c) -> b -> a -> c 

flip f取其(第一)兩個參數中的f相反的順序。

getCode :: [(a, Int)] -> [a] 
getCode = concatMap (uncurry (flip replicate)) 

,或是使用Data.Tupleswap做同樣的事情用一個元組,而不是功能參數:

getCode :: [(a, Int)] -> [a] 
getCode = concatMap (uncurry replicate . swap) 
+0

感謝您的幫助。 我正在考慮'reverse'功能。 – BCKN

+0

@BCKN'reverse'用於列表,但'swap'可以用於元組。感謝您的記憶慢跑;) – 4castle