2011-09-09 3 views
68

좋은 하루.텍스트 또는 Bytestring

내가 지금 하스켈에 관해 싫어하는 한 가지는 문자열로 작업하기위한 패키지의 양입니다.

처음에는 고유 한 Haskell [Char] 문자열을 사용했지만, hackage 라이브러리를 사용하기 시작했을 때 무한 변환으로 완전히 손실되었습니다. 모든 패키지는 다른 문자열 구현을 사용하는 것처럼 보이고 일부는 자체 수제를 채택합니다.

다음 나는 기능의 넓은 세트를 가지고 있기 때문에 내가 Text를 선택, Data.Text 문자열과 OverloadedStrings 확장자로 내 코드를 재 작성하지만, 많은 프로젝트가 ByteString을 선호하는 것 같다.
누군가가 짧은 이유를 사용하여 왜 다른 것을 사용하게 할 수 있습니까?

PS : btw에서 ByteString으로 변환하는 방법은 무엇입니까?

Couldn't match expected type Data.ByteString.Lazy.Internal.ByteString against inferred type Text Expected type: IO Data.ByteString.Lazy.Internal.ByteString Inferred type: IO Text

내가 Data.Text.Encoding에서 encodeUtf8을 시도,하지만 운 :

Couldn't match expected type Data.ByteString.Lazy.Internal.ByteString against inferred type Data.ByteString.Internal.ByteString

UPD : 응답

감사합니다, 그 * 덩어리 선 (善) 갈 방법처럼 보이지만 나는 다소 충격 그 결과 원래의 기능은 다음과 같습니다.

htmlToItems :: Text -> [Item] 
htmlToItems = 
    getItems . parseTags . convertFuzzy Discard "CP1251" "UTF8" 

그리고 이제되었다 :

htmlToItems :: Text -> [Item] 
htmlToItems = 
    getItems . parseTags . fromLazyBS . convertFuzzy Discard "CP1251" "UTF8" . toLazyBS 
    where 
     toLazyBS t = fromChunks [encodeUtf8 t] 
     fromLazyBS t = decodeUtf8 $ intercalate "" $ toChunks t 

그리고 네 우리가 그것에 Text를 제공 할 경우,이 기능은, 그 잘못 때문에 작동하지 않습니다, 우리가 사용하는이 텍스트가 제대로 인코딩 자신감과 준비가 그것을 변환 어리석은 일이지만, 그런 장황한 전환은 여전히 ​​htmltoItems 외부의 어딘가에서 일어나야 만합니다.

+33

하스켈 사람들은 통일 된 문자열을 가지고 있습니다 :) – Ankur

+6

@Ankur :'Text'는 사실상의 텍스트 구현이되고 있습니다. 문자열은 기존의 이유와 단순한 사유 때문에 여전히 존재하지만 심각한 텍스트 조작을 위해서는 텍스트를 사용해야합니다. – ivanm

+2

@ivanm : 모든 레거시 bytestring 기반 라이브러리 만 변환으로 변환 할 수 있습니다! –

답변

59

ByteStrings은 주로 바이너리 데이터에 유용하지만 필요한 경우 ASCII 문자 세트 만 있으면 텍스트를 처리하는 효율적인 방법이기도합니다. 유니 코드 문자열을 처리해야하는 경우 Text을 사용해야합니다. 그러나 어느 쪽도 다른쪽에 대한 대체품이 아니라 다른 것들을 위해 일반적으로 사용된다는 점을 강조해야합니다. Text은 순수한 유니 코드를 나타내지 만, 예를 들어 언제든지 이진 ByteString 표현을 인코딩 할 필요가 있습니다. 소켓이나 파일을 통해 텍스트를 전송하십시오. The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets

당신은 사용할 수 있습니다 : 여기

는 유니 코드 코드 포인트 ( Text을)의 관계를 설명 괜찮은 일을 유니 코드의 기본 사항에 대해 좋은 기사 및 인코딩 된 바이너리 바이트 ( ByteString)입니다 Data.Text.Encoding 두 데이터 유형간에 변환 할 모듈 또는 Data.Text.Lazy.Encoding (오류 메시지를 기반으로하는 것으로 보이는 것처럼) 지연 유형을 사용하는 경우.

+0

여기 내 모든 문자열이 이미 엄격하기 때문에 여기에 있습니다. 예상되는 유형과 일치 할 수 없습니다. 'Text 유추 된 유형 Data.Text.Lazy.Internal.Text'에 대해 그래서 FromChunks에서 Text, ok, but final을 찾았습니다. 아직 못생긴 결과. – Dfr

+1

"text"데이터에 bytestrings을 사용하지 마십시오. 필요한 모든 것이 ASCII 인 경우에도 사용하십시오. 텍스트 데이터에는 텍스트를 사용하고 압축 데이터 구조에는 ByteString을 사용합니다. ** 의미 론적 **을 나타내는 형식이 무엇인지에 모두 동의하면 사용할 형식과 궁극적으로 형식 간의 변환에 대한 혼란이 훨씬 줄어 듭니다. – nomen

21

텍스트 데이터 용으로 확실히 Data.Text를 사용하고 싶습니다.

encodeUtf8입니다.이 오류 :

Couldn't match expected type Data.ByteString.Lazy.Internal.ByteString against inferred type Data.ByteString.Internal.ByteString

당신이 게으른 bytestring을 기대 코드에 bytestring 엄격한을 공급하고 있다는 것을 의미한다. 변환은 fromChunks 기능을 쉽게 :

Data.ByteString.Lazy.fromChunks :: [Data.ByteString.Internal.ByteString] -> ByteString 

그래서 당신이 할 필요가 게으른 bytestring이 예상되는 곳마다 기능 fromChunks [myStrictByteString]를 추가합니다.

변환 다른 방법은 지연 함수를 사용하여 엄격한 청크 목록을 제공하는 이중 함수 toChunks으로 수행 할 수 있습니다.

바이 테스팅 인터페이스 대신 또는 추가로 텍스트 인터페이스를 제공 할 수있는 경우 일부 패키지 관리자에게 문의 할 수 있습니다.

5

Data.String.Conversions의 단일 기능 cs을 사용하십시오.

그것은 입력과 예상 종류에 따라, 당신은 String, ByteStringText (뿐만 아니라 ByteString.LazyText.Lazy) 사이의 변환을 할 수 있습니다.

여전히 전화를 걸어야하지만 더 이상 각 유형에 대해 걱정할 필요가 없습니다.

사용 예는 this answer을 참조하십시오.

관련 문제