좋은 날.
내가 지금 Haskell에 대해 싫어하는 것은 문자열 작업을위한 패키지의 양입니다.
처음에는 네이티브 Haskell [Char]
문자열을 사용했지만 해킹 라이브러리를 사용하려고했을 때 끝없는 변환으로 완전히 잃었습니다. 모든 패키지는 다른 문자열 구현을 사용하는 것처럼 보이며 일부는 자체 수작업을 채택합니다.
다음으로 Data.Text
문자열과 OverloadedStrings
확장자로 코드를 다시 작성 했습니다 Text
. 더 넓은 함수 세트를 가지고 있기 때문에 선택 했지만 많은 프로젝트에서 ByteString
.
누군가가 왜 하나 또는 다른 것을 사용 해야하는지 짧은 추론을 줄 수 있습니까?
PS : BTW 어떻게 변환하는 방법 Text
에 ByteString
?
예상 유형 Data.ByteString.Lazy.Internal.ByteString
을 유추 된 유형 텍스트 와 일치시킬 수 없습니다.예상 유형 : IO Data.ByteString.Lazy.Internal.ByteString 유추 된 유형 : IO 텍스트
encodeUtf8
에서 시도 Data.Text.Encoding
했지만 운이 없습니다.
유추 된 유형 Data.ByteString.Internal.ByteString 에 대해 예상 유형 Data.ByteString.Lazy.Internal.ByteString 을 일치시킬 수 없습니다.
UPD :
* Chunks goodness가 갈 길처럼 보이지만 결과에 다소 충격을 받았으며 원래 기능은 다음과 같습니다.
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
.
답변
ByteStrings
주로 바이너리 데이터에 유용하지만 ASCII 문자 집합 만 있으면 텍스트를 처리하는 효율적인 방법이기도합니다. 유니 코드 문자열을 처리해야하는 경우 Text
. 그러나 둘 다 다른 것을 대체하는 것이 아니며 일반적으로 다른 용도로 사용된다는 점을 강조해야합니다. Text
순수한 유니 코드 를 나타내지 만 ByteString
소켓이나 파일을 통해 텍스트를 전송할 때마다 이진 표현 으로 /부터 인코딩해야 합니다. .
다음은 유니 코드 코드 포인트 ( Text
)와 인코딩 된 바이너리 바이트 ( ByteString
) 의 관계를 설명하는 적절한 작업을 수행하는 유니 코드의 기본에 대한 좋은 기사입니다 . 모든 소프트웨어 개발자는 절대적으로 유니 코드와 문자에 대해 알아야합니다. 세트
Data.Text.Encoding 모듈을 사용하여 두 데이터 유형간에 변환하거나 지연 변형을 사용하는 경우 Data.Text.Lazy.Encoding 을 사용할 수 있습니다 (오류 메시지를 기반으로하는 것처럼 보임 ).
답변
텍스트 데이터에 Data.Text를 사용하고 싶을 것입니다.
encodeUtf8
갈 길입니다. 이 오류 :
유추 된 유형 Data.ByteString.Internal.ByteString에 대해 예상 유형 Data.ByteString.Lazy.Internal.ByteString을 일치시킬 수 없습니다.
게으른 바이트 문자열 을 예상하는 코드에 엄격한 바이트 문자열을 제공하고 있음을 의미합니다 . 다음 기능으로 변환이 쉽습니다 .fromChunks
Data.ByteString.Lazy.fromChunks :: [Data.ByteString.Internal.ByteString] -> ByteString
그래서 당신이해야 할 일은 함수를 추가하는 것입니다 fromChunks [myStrictByteString]
게으른 바이트 문자열이 예상되는 곳에 입니다.
이중 기능으로 다른 방식으로 변환 할 수 있습니다. toChunks
지연 바이트 문자열을 취하고 엄격한 청크 목록을 제공하는 .
일부 패키지의 관리자에게 바이트 문자열 인터페이스 대신 또는 추가로 텍스트 인터페이스를 제공 할 수 있는지 물어볼 수 있습니다.
답변
하나의 기능을 사용 cs
로부터를Data.String.Conversions
.
입력 및 예상 유형에 따라 String
, ByteString
및 Text
( ByteString.Lazy
및 및 Text.Lazy
) 간에 변환 할 수 있습니다.
여전히 호출해야하지만 더 이상 각 유형에 대해 걱정할 필요가 없습니다.
사용 예는 이 답변 을 참조하십시오 .