在Haskell中将字符串转换为具有设置布局的列表

时间:2019-03-19 11:08:46

标签: string haskell

我有以下函数可以放大,它需要一个字符串,例如“ 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]

在这里我要做的是,首先获取前两个字符对,然后再读取其他字符,然后对它们进行相同的操作。

2 个答案:

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