良い一日。
Haskellで今嫌いなのは、文字列を扱うためのパッケージの量です。
最初にネイティブのHaskell [Char]
文字列を使用しましたが、ハッキングライブラリを使い始めようとしたところ、無限の変換で完全に失われました。すべてのパッケージは異なる文字列実装を使用しているようで、一部は独自の手作りのものを採用しています。
次に、Data.Text
文字列とOverloadedStrings
拡張子を使用してコードを書き直しました。Text
を選択しました。これは、関数の幅が広いためですが、多くのプロジェクトがByteString
を好むようです。
誰かがなぜどちらか一方を使用する理由を簡潔に説明できるでしょうか?
PS:ところで、Text
からByteString
に変換する方法は?
予想されるタイプData.ByteString.Lazy.Internal.ByteStringを推定されるタイプTextと照合できませんでした:予想されるタイプ:IO Data.ByteString.Lazy.Internal.ByteString推定タイプ:IO Text
encodeUtf8
のData.Text.Encoding
を試しましたが、うまくいきませんでした:
予想されるタイプData.ByteString.Lazy.Internal.ByteStringを推定タイプData.ByteString.Internal.ByteStringと照合できませんでした
PD:
*チャンクの良さは進むべきように見えますが、結果に少しショックを受け、元の関数は次のようになりました。
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文字セットのみである場合、テキストを処理する効率的な方法でもあります。Unicode文字列を処理する必要がある場合は、Text
を使用する必要があります。ただし、どちらも他の代替品ではないことを強調する必要があります。これらは通常、さまざまな目的で使用されます。Text
は純粋なユニコードを表しますが、たとえばソケットを介してテキストを転送する場合は常に、バイナリのByteString
表現との間でエンコードする必要があります。またはファイル。
これはユニコードの基本についての良い記事です。ユニコードコードポイント(Text
)とエンコードされたバイナリバイト(ByteString
)の関係を説明する適切な仕事をします: The Absolute Minimum Everyソフトウェア開発者は絶対に、積極的にUnicodeと文字セットについて知っておく必要があります
Data.Text.Encoding モジュールを使用して2つのデータ型間で変換するか、 Data.Text.Lazyを使用できます。 .Encoding 遅延バリアントを使用している場合(エラーメッセージに基づいて実行しているように見える場合)。
あなたは間違いなくData.Textをテキストデータに使用したいです。
encodeUtf8
は進むべき道です。このエラー:
予想される型Data.ByteString.Lazy.Internal.ByteStringを推定型Data.ByteString.Internal.ByteStringと照合できませんでした
lazyバイト文字列を期待するコードにstrictバイト文字列を提供していることを意味します。変換はfromChunks
関数で簡単です:
Data.ByteString.Lazy.fromChunks :: [Data.ByteString.Internal.ByteString] -> ByteString
だからあなたがする必要があるのは関数fromChunks [myStrictByteString]
遅延バイト文字列が必要な場所。
逆の変換は、遅延バイト文字列を取り、厳密なチャンクのリストを提供するデュアル関数toChunks
を使用して実行できます。
一部のパッケージのメンテナーに、バイトストリングインターフェースの代わりに、またはバイトストリングインターフェースに加えて、テキストインターフェースを提供できるかどうかを尋ねることができます。
_Data.String.Conversions
_から単一の関数cs
を使用します。
入力と予想される型に応じて、String
、ByteString
、Text
(および_ByteString.Lazy
_と_Text.Lazy
_)の間で変換できます。
あなたはまだそれを呼び出す必要がありますが、それぞれのタイプについて心配する必要はありません。
使用例については this answer を参照してください。