解码字符串;例如c1d2=cdd



我正在尝试解码一个可以包含数字的字符串,但不确定除了这样的模式匹配之外,如何检测这些字符。

这并不是要用任何导入的库函数来完成的,我只需要找到一种方法,根据初始字符后面的数字来重复字符。

decode :: String -> String
decode [] = []
decode (x:xs)
| x == '1' = x : decode xs
| x == '2' = x : x : decode xs
| x == '3' = x : x : x : decode xs
| x == '4' = x : x : x : x : decode xs
| x == '5' = x : x : x : x : x : decode xs
| x == '6' = x : x : x : x : x : x : decode xs
| x == '7' = x : x : x : x : x : x : x : decode xs
| x == '8' = x : x : x : x : x : x : x : x : decode xs
| x == '9' = x : x : x : x : x : x : x : x : x : decode xs
| otherwise = (x:xs)

这样做只会返回以下内容:

ghci> decode "a1b2"
"a1b2"

所以我不确定目前出了什么问题

您看到的第一个字符是一个数字,然后重复该数字。否则,您只是返回输入字符串。

这是不对的。

我们需要查看字符串开头的两个字符。如果第二个是数字,我们需要重复。如果不是,那么典型的行程编码意味着它只发生一次毕竟,"c1""c"长,这导致了较差的压缩系统

幸运的是,模式匹配使这一点变得简单明了。

使用您相当简单但乏味的重复逻辑:

decode (a:'1':xs) = a : decode xs
decode (a:'2':xs) = a : a : decode xs
...
decode (a:'9':xs) = a : a : a : a : a : a : a : a : a : decode xs
decode (a:xs) = a : decode xs
decode x = x

如果导入Data.Char,则可以测试第二个字符是否为数字,然后操作该数字以正确次数重复该字符。

import Data.Char
decode (a:b:xs) 
| isDigit b = ...
| otherwise = a : decode (b:xs)
decode x = x

最新更新