Haskell 的默认实现在速度和内存方面效率不高的事实String
是众所周知的。据我所知[] lists
,通常在 Haskell 中作为单链表实现,对于大多数小/简单的数据类型(例如Int
)来说,这似乎不是一个好主意,但String
似乎完全是矫枉过正。关于这个问题的一些意见包括:
在像这样的简单基准测试中,即使是用 Python 等解释性语言编写的程序也能胜过使用 String 的 Haskell 代码一个数量级。
由于String只是[Char],即Char的链表,这意味着String的引用局部性较差,再次意味着String在内存中相当大,至少为N *(21bits + Mbits),其中N是字符串的长度,M 是指针的大小 (...)。编译器不太可能将字符串优化为循环等。
我知道 HaskellByteString
的 s(和Array
s)有几种不错的风格,它们可以很好地完成这项工作,但我希望默认实现是最有效的实现。
TL;DR:为什么 Haskell 的默认String
实现是一个单链表,尽管它非常低效并且很少用于现实世界的应用程序(除了非常简单的应用程序)?有历史原因吗?更容易实现吗?