我有以下函数可以放大,它需要一个字符串,例如“ 5a”,并在列表中输出,即。 [('a',5)]
。我如何更改它以使其允许输入多于1对,所以如果输入类似“ 5a5b”的内容,则输出将为[('a',5),('b',5)]
?
我为此的当前代码在这里:
enlarge :: String -> [(Char,Int)]
enlarge [] = []
enlarge xs = [(a,b) | (b,a:_) <- reads xs]
上面的代码有效,并且只适用于一对,即如果输入“ 5a”,它将输出[('a',5)]
。但是,我想对其进行更改,以便它允许使用多个对,即。如果输入“ 5a3b”,则输出应为[('a',5),('b',3)]
。当前,它仅考虑字符串的前2个部分。
我在这里尝试这样做:
enlarge xs = [((a,b),ts) | ((b,a),ts) <- reads xs, reads ts]
在这里我要做的是,首先获取前两个字符对,然后再读取其他字符,然后对它们进行相同的操作。
答案 0 :(得分:5)
我为您的请求编写了一个递归代码。
enlarge :: String -> [(Char,Int)]
enlarge [] = []
enlarge (x:y:ls) = [(y,digitToInt x)] ++ enlarge ls
此处,代码假定输入长度为偶数。并使用digitToInt
将Char转换为Int。
答案 1 :(得分:4)
我们需要更多的输入输出示例。例如,"12z"
应该如何处理?同样,reads
的含义还不清楚。但是我想你要
[(c, read i :: Int) | [i, c] <- chunksOf 2 xs]
不要忘记导入Data.List.Split中的chunksOf
。