Data.Text与string

尽pipeHaskell社区的一般观点似乎是,最好是使用Text而不是String ,事实上,大多数维护库的API仍然是以String导向的,这使得我迷惑不解。 另一方面,还有一些值得注意的项目 ,它们将String视为一个错误,并提供了一个Prelude其中包含所有以String oriented为目的函数的实例,并将其replace为Text -counterparts。

那么除了向后和标准的Prelude-兼容性和“转换惯性”之外,还有什么原因让人们继续编写面向String的API? 与String相比, Text可能还有其他什么缺点?

特别是,我对此感兴趣,因为我正在devise一个库,并试图决定使用哪种types来表示错误消息。

我不合格的猜测是,大多数库作者不希望添加更多的依赖关系。 由于string是Haskell发行版的一部分(它是语言标准的一部分!),如果使用string,并且不要求用户从发行版中挑选文本发行版,那么获得采用就会容易得多。

除非你能说服大部分的社区转换,否则这就是你必须忍受的那些“devise错误”之一。 只要看看应用程序成为Monad的一个超类的时间已经到了多长时间了 – 这是一个相对较小但是非常想要的变化 – 并且想象用Text代替所有的String事物需要多长时间。


要回答你更具体的问题:除非你通过使用文本获得明显的性能好处,否则我会用String。 错误消息通常是相当小的一次性的事情,所以使用String不应该是一个大问题。

另一方面,如果你是那种避开理想主义的实用主义的思想纯粹主义者,那就用文本吧。


*我把恐怖报价中的devise错误,因为string作为一个字符列表是一个整洁的属性,使他们很容易推理和整合与其他现有的列表操作function。

如果您的API旨在处理大量的面向字符的数据和/或各种编码,那么您的API应该使用文本

如果您的API主要用于处理小的一次性string,那么使用内置的Stringtypes应该没问题。

对大量文本使用string将使使用您的API的应用程序消耗更多的内存。 使用它与外国编码可能会严重复杂的使用取决于您的API如何工作。

string是相当昂贵的(至less5N字其中N是string中的字符数)。 一个字是与处理器体系结构相同的位数(例如32位或64位): http : //blog.johantibell.com/2011/06/memory-footprints-of-some-common-data.html

在小项目中使用[Char]至less有三个理由。

  1. [Char]不依赖于任何神秘的职员,像外国指针,原始记忆,原始数组等,可能在不同的平台上工作不同,甚至完全不可用

  2. [Char]是haskell的通用语。 在haskell中至less有三种“有效的”方式来处理unicode数据: utf8-bytestring Data.Text.TextData.Text.TextData.Vector.Unboxed.Vector Char ,每个都需要处理额外的包。

  3. 通过使用[Char]可以获得[] monad的所有权限,包括许多特定的function(替代的string软件包也试图帮助它,但仍然)

就我个人而言,我认为基于utf16Data.Text是haskell社区最值得怀疑的一个,因为utf16结合了utf8utf32编码的缺陷,而没有任何好处。

我不认为有一个string保留技术原因。 我可以看到几个要去的地方。

总的来说,我会首先争辩说,在文本/string的情况下,只有一个最好的解决scheme:

  • 弦乐表演很糟糕,大家都同意这一点

  • 文字不难使用。 string上常用的所有函数都可以在Text上使用,而在string的上下文(replace,填充,编码)

  • 有两个解决scheme会造成不必要的复杂性,除非所有的基本function都是多态的 certificate: 有关自动转换主题的SO问题 。 所以这一个问题。

所以一个解决scheme比两个解决scheme简单一些,String的缺点最终会使它消失。 越快越好!

我不知道是否Data.Text总是比Data.String更高效?

“cons”例如对于string是O(1),对于文本是O(n)。 追加是stringO(n)和严格文本的O(n + m)。 同样,

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

string的空间效率高于严格的文本。

与效率无关的其他问题是模式匹配(明显的代码)和懒惰(string中可预测的每个字符,某种实现依赖于惰性文本)。

文本对于静态字符序列和就地修改显然是很好的。 对于其他forms的结构编辑,Data.String可能有优势。