2014-06-12 3 views
0

나는 최근에 실제로 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"?

+1

출력으로 "12345"를 어떻게 디코딩하겠습니까? – augustss

+0

@augustss :이 작업에서는 입력에 숫자가 없다고 가정합니다. – mhl

+1

충분합니다. BTW, 당신은'[]'에 특별한 경우가 필요하지 않으며,'zip'은 특히'Control.Arrow. &&& '를 사용하여'group'에 대한'map'으로 대체 될 수 있습니다. – augustss

답변

6

show은 Haskell 소스 코드에 나타나는 값을 인쇄하는 데 사용되므로 문자 주위에 작은 따옴표 (및 문자열 주위에 큰 따옴표 등)를 넣습니다. 대신 문자 만 표시하려면 [snd x]을 사용하십시오.

하스켈에서 String은 List of Char의 줄임말입니다. 예를 들어, 문자열 "Foo"은 다음과 같이 작성할 수도 있습니다. ['F','o','o']. 따라서 한 문자를 문자열로 변환하려면 괄호 안에 넣어야합니다 ([char]).

1

문제는 문자에 show을 사용하는 것입니다. show 'a' == "'a'".

문자열은 문자 목록 일 뿐이므로 c 문자가있는 경우 c을 포함하는 한 문자 문자열은 단지 [c]입니다.