2014-06-12 66 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]