考虑一串a2b4g9
。
我怎样才能将它转换成类型为[(char,int)]的二维数组,如
(a,2)
(b, 4)
(g, 9)
我会使用concat
还是别的什么?
如何做到这一点?
答案 0 :(得分:5)
我建议最简单的方法就是编写一个递归函数来完成它。只要您的数字永远不会高于9,这样的事情就应该有效:
toTuple :: String -> [(Char,Int)]
toTuple [] = []
toTuple (letter:reps:rem) = (letter,read [reps]) : toTuple rem
如果你的数字确实高于9,那么它会变得有点复杂,因为重复次数是可变长度。
(编辑:FUZxxl和我在同一时间发布了几乎相同的解决方案,但那是因为这是明显的答案。我在发布之前没有看到他的帖子)
另一个解决方案是编写一个函数来获取列表的每个第二个元素,然后使用zip函数组合生成的字母和重复列表。
或者你可以稍微超过顶部并使用像parsec这样的解析器组合器:
import Text.Parsec
import Control.Monad
parseFunc :: String -> String -> Either ParseError [(Char,Int)]
parseFunc = parse (many letterPair)
where
letterPair = do
l <- letter
d <- many digit
return (l, read d)
答案 1 :(得分:0)
试试这个:
f :: String -> [(Char,Int)]
f [] = []
f (x:y:zs) = (x,read [y]) : f zs
或者这个:
import Data.List
import Data.Maybe
f :: String -> [(Char,Int)]
f = catMaybes . snd . mapAccumL a Nothing where
a acc x = maybe (Just x,Nothing) (\acc' -> (Nothing,Just (acc',read [x]))) acc