虽然Haskell社区的普遍观点似乎是使用Text
而不是String
总是更好,但大多数维护库的API仍然是面向String
的,这一事实让我感到非常困惑。其将x1M3N1x完全视为错误,并提供x1M4N1x,其中面向x1M5N1x的函数的所有示例被替换为它们的x1M6N1x对应物。
那么,除了向后和标准Prelude兼容性以及“切换惯性”之外,人们还有什么理由继续编写面向String
的API呢?与String
相比,Text
还有什么其他缺点吗?
特别是,我对此感兴趣,因为我正在设计一个库,并试图决定使用哪种类型来表示错误消息。
5条答案
按热度按时间xxslljrj1#
我不确定的猜测是大多数库作者不想添加不必要的依赖项。因为字符串是每个Haskell发行版的一部分(它是语言标准的一部分!),如果你使用字符串并且不要求你的用户从hackage中挑选出Text发行版,它会更容易被采用。
这是一个“设计错误”,除非你能说服社区中的大多数人改变它,否则你只能忍受它。看看把Applicationative变成Monad的超类花了多长时间--一个相对较小但非常需要的变化--想象一下用Text替换所有String需要多长时间。
要回答您更具体的问题:我会使用String,除非您通过使用Text获得了明显的性能优势。错误消息通常是相当小的一次性事件,因此使用String应该不是大问题。
另一方面,如果你是那种意识形态纯粹主义者,为了理想主义而回避实用主义,那就选择文本。
laik7k3q2#
如果您的API旨在处理大量面向字符的数据和/或各种编码,则您的API应使用Text。
如果您的API主要用于处理小的一次性字符串,那么使用内置的String类型就可以了。
对大量文本使用String会使使用您的API的应用程序占用更多内存。根据您的API的工作方式,将其与外部编码一起使用可能会使使用变得非常复杂。
字符串是相当昂贵的(至少5 N个字,其中N是字符串中的字符数)。一个字的位数与处理器体系结构的位数相同(例如,32位或64位):http://blog.johantibell.com/2011/06/memory-footprints-of-some-common-data.html
wribegjk3#
在小型项目中使用[Char]至少有三个原因。
[Char]
不依赖于任何晦涩难懂的人员,如外部指针、原始内存、原始数组等,这些人员在不同的平台上可能工作方式不同,甚至完全不可用[Char]
是haskell中的通用语言。在haskell中至少有三种“有效”的方法来处理unicode数据:utf8-bytestring
、Data.Text.Text
和Data.Vector.Unboxed.Vector Char
,每一个都需要处理额外的包。1.通过使用
[Char]
,可以访问[]
单子的所有功能,包括许多特定的函数(其他字符串包确实试图帮助它,但仍然如此)就我个人而言,我认为基于utf16的
Data.Text
是haskell社区中最有问题的决定之一,因为utf16结合了utf8和utf32编码的缺陷,而没有它们的任何优点。093gszye4#
我想知道Data.Text是否总是比Data.String更有效?
例如,“cons”对于字符串是O(1)而对于文本是O(n)。Append对于字符串是O(n)而对于严格文本是O(n+m)。同样,
对于字符串比对于严格文本更节省空间。
其他与效率无关的问题是模式匹配(清晰的代码)和懒惰(可以预见,字符串中的每个字符,懒惰文本中的实现依赖于某种程度)。
Text显然适用于静态字符序列和就地修改。对于其他形式的结构编辑,Data.String可能更有优势。
9cbw7uwe5#
我不认为有一个单一的技术原因字符串保留。我可以看到几个原因,它去。
总的来说,我首先要指出的是,在文本/字符串的情况下,只有一个最好的解决方案:
所以一个解决方案比两个简单,而String的缺点最终会让它消失,越快越好!