HaskellのデフォルトのString
実装は、速度とメモリの両方の点で効率的ではないという事実はよく知られています。私の知る限り[] lists
、一般的には単一リンクリストとしてHaskellに実装されており、ほとんどの小さい/単純なデータ型(たとえばInt
)の場合、それはあまり良い考えではないようですが、String
完全にやり過ぎのようです。この問題に関する意見のいくつかは次のとおりです。
このような単純なベンチマークでは、Pythonなどのインタプリタ言語で記述されたプログラムでさえ、Stringを使用するHaskellコードを桁違いに上回る可能性があります。
文字列は[Char]、つまりCharのリンクリストであるため、文字列の参照の局所性が低いことを意味します。また、文字列はメモリ内でかなり大きいことを意味します。少なくともN *(21bits + Mbits)ここでNは文字列の長さ、Mはポインタのサイズ(...)です。文字列は、コンパイラによってループなどに最適化される可能性がはるかに低くなります。
Haskellにはいくつかの素晴らしいフレーバーのByteString
s(およびArray
s)があり、それらがうまく機能することを知っていますが、デフォルトの実装が最も効率的なものになると思います。
TL; DR:HaskellのデフォルトのString
実装は、非常に非効率的で、実際のアプリケーション(本当に単純なアプリケーションを除く)ではめったに使用されないのに、なぜ単一リンクリストなのですか?歴史的な理由はありますか?実装は簡単ですか?