2012-01-23 4 views
11

ByteString[ByteString]으로 구분하는 간단한 함수를 작성하려면 '\n'을 구분 기호로 사용하고 싶습니다. 내 시도 : '\n'Char 오히려 Word8보다 때문 오류가 발생합니다하스켈 Word8을 만드는 방법?

import Data.ByteString 

listize :: ByteString -> [ByteString] 
listize xs = Data.ByteString.splitWith (=='\n') xs 

, 기대하고 무엇을 Data.ByteString.splitWith입니다.

ByteString은이 간단한 문자를 Word8으로 어떻게 변환합니까?

답변

14

당신은 10 숫자 문자를 사용하지만이 문자를 변환 할 경우합니다 (fromIntegralWord8Intord 그 수익을 변환하는 데 필요한) fromIntegral (ord '\n')를 사용할 수있는 문자 수 있습니다. ord에 대해 Data.Char을 가져와야합니다.

또한 같은 ByteString 데이터 유형에 Char를 사용하는 대신 Word8에 대한 기능을 제공 Data.ByteString.Char8를 가져올 수 있습니다. (Char가 무엇을 나타내는 지입니다) ByteString하지 저장 유니 코드 코드 포인트로, 그러나, 이것은 일반적으로 권장되지이다 (사실,이. 정확하게 당신이 원하는 않는 lines 기능을 가지고있다) 대신 원시 옥텟 (즉, Word8 s).

텍스트 데이터를 처리하는 경우 ByteString 대신 Text을 사용해야합니다.

+0

와우. 우수한. 나는 성격 표현을 파헤쳐 야 할 것입니다. 캐릭터의 숫자 리터럴이 무엇인지 전혀 알지 못합니다. 어딘가에 그 목록이 있습니까? –

+0

문자열, 정수 및 복식을 포함하는 단백질 데이터베이스 파일을 구문 분석 할 프로그램을 작성 중입니다. 문자열은 주로 목록에서 올바른 항목을 식별하는 데 사용되지만 int 및 double은 수학 연산에 사용됩니다. 나는 이것을 위해 어떤 수업을 사용해야하는지 잘 모릅니다. –

+1

GHCi에서'ord'를 사용하여 문자의 코드 포인트 번호를 찾을 수 있습니다. :) 일반적으로 [fileformat.info] (http://www.fileformat.info/info/unicode/index.htm)에서 유니 코드 데이터를 얻습니다. [기본 라틴] (http://www.fileformat.info/info/unicode/block/basic_latin/index.htm) 블록에는 ASCII에서 상속 된 128 개의 코드 포인트가 포함되어 있습니다. – ehird