将字符串提取为二维数组?

时间:2011-03-06 20:22:14

标签: haskell

考虑一串a2b4g9

我怎样才能将它转换成类型为[(char,int)]的二维数组,如

(a,2)
(b, 4)
(g, 9)

我会使用concat还是别的什么?

如何做到这一点?

2 个答案:

答案 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