我最近开始学习haskell,我正在做wikibooks的练习。 我正在使用RLE编码进行练习,我得到了这样的解决方案:
import Data.List
rle :: String -> [(Int,Char)]
rle [] = []
rle xs = zip lengths chars
where
groups = group xs
lengths = map length groups
chars = map head groups
rle_toString :: [(Int, Char)] -> String
rle_toString [] = []
rle_toString (x:xs) = show (fst x ) ++ show (snd x) ++ rle_toString xs`
不是一个非常优雅的解决方案,但它几乎可以工作。问题是,我输出如下:"7'a'8'b'7'j'6'q'3'i'7'q'1'p'1'a'16'z'2'n'"
。带有字符的单引号并不优雅。如何实现输出:"7a8b7j6q3i7q1p1a16z2n"
?
答案 0 :(得分:6)
show
用于打印Haskell源代码中出现的值,因此在字符周围放置单引号(以及字符串周围的双引号,依此类推)。请改用[snd x]
来显示角色。
在Haskell中,String
只是Char of Char [Char]
的简写。例如,字符串"Foo"
也可以这样写:['F','o','o']
。因此,要将单个字符转换为字符串,只需将其放入括号中:[char]
。
答案 1 :(得分:1)
问题是你在角色上使用show
。 show 'a' == "'a'"
。
解决方案是要意识到字符串只是字符列表,所以如果c
是一个字符,那么包含c
的单字符字符串只是[c]
。