gpt4 book ai didi

haskell - `Data.Text` 与 `Data.Vector.Unboxed Char`

转载 作者:行者123 更新时间:2023-12-02 09:51:50 24 4
gpt4 key购买 nike

Data.TextData.Vector.Unboxed Char 内部工作方式有什么区别吗?为什么我会选择其中之一而不是另一个?

我一直认为 Haskell 将 String 定义为 [Char] 很酷。是否有原因没有对 TextVector Char 进行类似操作?

使它们相同肯定会有一个优点...可以编写文本-y 和矢量-y 工具以在两个阵营中使用。想象一下扑克牌串上的整数绳或正则表达式。

当然,我知道这可能有历史原因,并且我知道大多数当前库使用 Data.Text,而不是 Vector Char,因此有很多实际原因偏爱一个人而不是另一个人。但我更感兴趣的是了解抽象的品质,而不是我们当前所处的状态……如果明天重写整个事情,将两者统一起来会更好吗?

编辑,提供更多信息-

正确看待事物-

  1. 根据此页面,http://www.haskell.org/haskellwiki/GHC/Memory_Footprint ,GHC 在程序中为每个字符使用 16 个字节!

  2. Data.Text 的索引时间复杂度不是 O(1),而是 O(n)。

  3. 绳索(包裹文本的二叉树)也可以保存字符串......它们对于索引/插入/删除具有更好的复杂性,尽管根据节点数量和树的平衡,索引可能会很接近到文本。

这是我的收获-

  1. TextVector Char 内部不同......

  2. 如果您不关心性能,请使用字符串。

  3. 如果性能很重要,则默认使用文本。

  4. 如果需要对字符进行快速索引,并且您不介意大量内存开销(最多 16 倍),请使用 Vector Char。

  5. 如果您想要插入/删除大量数据,请使用 Ropes。

最佳答案

Text 视为字符列表是一个相当糟糕的主意。 Text 被设计为不透明的、用户可读的 Unicode 文本 block 。字符边界可以根据编码、区域设置、语言、月份时间、月相、盲人参与者进行的抛硬币以及委内瑞拉国鸟的迁徙模式来定义。同样的情况也发生在排序、向上转换、反转等方面。

这是一个很长的说法,Text 是一种代表人类语言的抽象类型,并且远远超出了它的方式,与其实现的行为方式不一样,无论是 ByteStringVector UTF16CodePoint 或完全独特的东西(就是这种情况)。

为了澄清这种区别,请注意,不能保证 unpack 。 pack 见证了同构,即从 Text 转换为 ByteString 的首选方式是在 Data.Text.Encoding 中 并且是部分的,并且有一个完整复杂的插件模块 text-icu充斥着处理人类语言字符串的复杂方法。

如果您正在处理人类语言字符串,您绝对应该使用Text。您还应该非常小心地对待它,因为人类语言字符串不容易接受计算机处理。如果您的字符串更好地被视为机器字符串,您可能应该使用ByteString

type String = [Char] 的教学优势很高,但实际优势却很低。

关于haskell - `Data.Text` 与 `Data.Vector.Unboxed Char`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20691463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com