2014-06-12 31 views
0

我最近刚开始学习haskell,现在我正在做一些wikibooks的练习。 我做运动与RLE编码,我已经跟解决方案是这样的:Haskell char引号

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"

+1

有了这个输出,你会如何解码“12345”? – augustss

+0

@augustss:此任务假定输入没有数字。 – mhl

+1

够公平的。顺便说一句,''''''''不需要特殊情况,'zip'也可以用'group'代替'group',特别是使用'Control.Arrow。&&&'。 – augustss

回答

6

show用于打印Haskell源代码中出现的值,从而在字符周围放置单引号(以及围绕字符串的双引号等等)。改用[snd x]来显示字符。

在Haskell中,String只是Char的列表的一个简写[Char]。例如,字符串"Foo"也可以这样写:['F','o','o']。因此,要将单个字符转换为字符串,只需将其放入括号中:[char]

1

问题是您在字符上使用showshow 'a' == "'a'"

解决方案是要认识到字符串只是字符列表,所以如果c是一个字符,那么包含c的单字符字符串只是[c]