web-dev-qa-db-ja.com

Data.Text vs String

Haskellコミュニティの一般的な意見は、Textの代わりにStringを使用する方が常に良いと思われますが、メンテナンスされているほとんどのライブラリのAPIはString -指向は私から地獄を混乱させます。一方、 注目すべきプロジェクト があり、Stringを完全に誤りと見なし、Prelude- orientedのすべてのインスタンスにStringを提供します。関数はText- counterpartsに置き換えられました。

だから、後方および標準のプレリュード互換性と「スイッチ作成の相互作用」を除き、人々がString指向のAPIを書き続ける理由はありますか? Textに比べてStringに他の欠点はあるのでしょうか?

特に、ライブラリを設計し、エラーメッセージを表現するために使用するタイプを決定しようとしているため、これに興味があります。

69
Nikita Volkov

私の不適格な推測は、ほとんどのライブラリ作成者は必要以上の依存関係を追加したくないということです。文字列は文字通りすべてのHaskellディストリビューションの一部であるため(言語標準の一部です!)、文字列を使用し、ユーザーにテキスト配布をハッキングから整理する必要がない場合、採用がはるかに容易です。

コミュニティのほとんどに一晩で切り替えるよう説得できない限り、それはあなたがただ一緒に暮らさなければならない「設計ミス」の1つです。 ApplicativeがMonadのスーパークラスになるのにどれだけ時間がかかったか(比較的マイナーではあるが、求められていた変更)を見て、すべての文字列をテキストで置き換えるのにどれくらいかかるかを想像してください。


より具体的な質問に答えるには、Textを使用して顕著なパフォーマンス上の利点が得られない限り、Stringを使用します。通常、エラーメッセージはかなり小さな1回限りのものであるため、Stringを使用することは大きな問題にはなりません。

一方、あなたが理想主義のためにプラグマティズムを避けているようなイデオロギー的純粋主義者であるなら、テキストで行く。


*文字列リストとしての文字列は、他の既存のリスト操作関数について簡単に推論し、統合することができるきちんとしたプロパティであるため、デザインの間違いを怖い引用符で囲みます。

26
kqr

APIが大量の文字指向データやさまざまなエンコーディングの処理をターゲットにしている場合、APIはTextを使用する必要があります。

APIが主に小さな1回限りの文字列を処理するためのものである場合、組み込みStringタイプを使用することで問題ありません。

大量のテキストにStringを使用すると、APIを使用するアプリケーションが大幅に多くのメモリを消費します。 APIがどのように機能するかに応じて、外部エンコーディングで使用すると、使用が著しく複雑になる可能性があります。

文字列は非常に高価です(少なくとも5Nワード(Nは文字列内のCharの数))。 Wordは、プロセッサアーキテクチャと同じビット数です(例:32ビットまたは64ビット): http://blog.johantibell.com/2011/06/memory-footprints-of-some-common-data .html

23
Alain O'Dea

小さなプロジェクトで[Char]を使用する理由は少なくとも3つあります。

  1. [Char]は、外部ポインタ、未加工メモリ、未加工配列など、異なるプラットフォームで異なる動作をするか、完全に利用できなくなるような難解なスタッフに依存しません。

  2. [Char]はhaskellの共通語です。 haskellでUnicodeデータを処理するには、少なくとも3つの「効率的な」方法があります。utf8-bytestringData.Text.Text、およびData.Vector.Unboxed.Vector Charで、それぞれ追加のパッケージを処理する必要があります。

  3. [Char]を使用することにより、多くの特定の関数を含む[]モナドのすべての機能にアクセスできます(代替文字列パッケージはそれを支援しようとしますが、それでも)

個人的には、utf16ベースData.Textは、utf16が結合するため、haskellコミュニティの最も疑わしい記述の1つと考えていますutf8utf32エンコーディングの両方の欠点であるが、その利点はありません。

7
permeakra

Stringが残る唯一の技術的理由があるとは思わない。そして、私はそれが行くためにいくつかのものを見ることができます。

全体として、最初に、テキスト/文字列の場合に最適なソリューションは1つしかないと主張します。

  • 文字列のパフォーマンスが悪い、誰もがそれに同意します

  • テキストの使用は難しくありません。文字列で一般的に使用されるすべての関数はテキストで利用でき、さらに文字列のコンテキストでさらに便利なものもあります(置換、パディング、エンコード)

  • 2つのソリューションがあると、すべての基本関数が多態的にされない限り、不必要な複雑さが生じます。証明: 自動変換の問題に関するSOの質問 があります。したがって、これはis問題です。

したがって、1つの解決策は2つほど複雑ではなく、Stringの欠点により、最終的には解決されます。早いほど良い !

4
Titou

Data.TextはData.Stringよりも常に効率的ですか?

たとえば、「cons」はO(1) Stringsで、O(n)Text。Appendis O(n)文字列の場合、O(n + m)は厳密なテキストの場合。

    let foo = "foo" ++ bigchunk
        bar = "bar" ++ bigchunk

厳密なテキストよりも文字列の方がスペース効率が高くなります。

効率に関連しない他の問題は、パターンマッチング(見苦しいコード)と遅延(文字列では文字ごとに、遅延テキストでは何らかの方法で実装に依存する)です。

テキストは、静的な文字シーケンスやインプレース変更に明らかに適しています。他の形式の構造編集の場合、Data.Stringには利点があります。

4
Passing By