- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Data.Text
和 Data.Vector.Unboxed Char
内部工作方式有什么区别吗?为什么我会选择其中之一而不是另一个?
我一直认为 Haskell 将 String
定义为 [Char]
很酷。是否有原因没有对 Text
和 Vector Char
进行类似操作?
使它们相同肯定会有一个优点...可以编写文本-y 和矢量-y 工具以在两个阵营中使用。想象一下扑克牌串上的整数绳或正则表达式。
当然,我知道这可能有历史原因,并且我知道大多数当前库使用 Data.Text
,而不是 Vector Char
,因此有很多实际原因偏爱一个人而不是另一个人。但我更感兴趣的是了解抽象的品质,而不是我们当前所处的状态……如果明天重写整个事情,将两者统一起来会更好吗?
编辑,提供更多信息-
正确看待事物-
根据此页面,http://www.haskell.org/haskellwiki/GHC/Memory_Footprint ,GHC 在程序中为每个字符使用 16 个字节!
Data.Text 的索引时间复杂度不是 O(1),而是 O(n)。
绳索(包裹文本的二叉树)也可以保存字符串......它们对于索引/插入/删除具有更好的复杂性,尽管根据节点数量和树的平衡,索引可能会很接近到文本。
这是我的收获-
Text
和 Vector Char
内部不同......
如果您不关心性能,请使用字符串。
如果性能很重要,则默认使用文本。
如果需要对字符进行快速索引,并且您不介意大量内存开销(最多 16 倍),请使用 Vector Char。
如果您想要插入/删除大量数据,请使用 Ropes。
最佳答案
将 Text
视为字符列表是一个相当糟糕的主意。 Text
被设计为不透明的、用户可读的 Unicode 文本 block 。字符边界可以根据编码、区域设置、语言、月份时间、月相、盲人参与者进行的抛硬币以及委内瑞拉国鸟的迁徙模式来定义。同样的情况也发生在排序、向上转换、反转等方面。
这是一个很长的说法,Text
是一种代表人类语言的抽象类型,并且远远超出了它的方式,与其实现的行为方式不一样,无论是 ByteString
、Vector 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/
有没有办法使用像这样的变量类型来拆箱/转换 var varType = typeof(int); var variable = 5; return (varType)variable; 最佳答案 您的
显式编码拆箱已包装的原始数值。在Java5及以上的版本,拆箱是不必要的,可以安全地删除。那么 JDK5 到底做了啥? 自动装箱(auto-boxing)与自动拆箱(auto-unboxing) Jav
我尝试用下一种方式比较整数(对于我来说,这很好): public void compareMayNull(Integer a, Integer b) { if ((a == null ? -1
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicates: Why do we need boxing and unboxing in C#? What is box
我有一个数据类型 newtype Zq q = Zq (IntType q) 其中 'q' 将是该类的一个实例 class Foo a where type IntType a 而“IntTyp
根据 Haskell 文档,you can't pass a primitive value to a polymorphic function or store one in a polymorph
我正在学习在 Swift 中解析来自 Android/Java 的 JSON,我正在使用 John Sundell 的 Unbox 来帮助我解决这个问题,这让我想起了 GSON。引用:Unbox po
Data.Vector.Unboxed不是 Foldable 的实例.编写适用于 Foldable 实例的函数的最佳方法是什么?以及未装箱的向量?例如这个版本的 sum适用于列表和装箱向量,但不能使用
我有一个应用程序,它花费大约 80% 的时间使用 Kahan summation algorithm 计算高维向量(dim=100)的大列表(10^7)的质心。 .我已尽力优化求和,但它仍然比等效的
我怀疑这可能是 Rakudo 中的一个错误,但我今天才开始使用 Perl 6,所以很有可能我只是犯了一个错误。在这个简单的程序中,在 sub 中声明一个类型化数组似乎会让 Perl 6 编译器生气。删
我已经编写了一些代码,其中一小部分代码采用一个大的一维 Unboxed.Vector 并将它们作为 Vector (Vector a) 返回。 代码的一部分给出了错误。这是一段与实际代码相似的示例代码
可以导出 Storable通过 GHC 的通用推导机制:http://hackage.haskell.org/package/derive-storable (和 https://hackage.ha
我想在没有的情况下从 double 类型转换为 long BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION 错误。 我被困在给出上述错误的声明中。 请
为了说明我的问题,请考虑以下简单示例 (C#): object reference = new StringBuilder(); object box = 42; object unset = nul
我有一个项目 enable在 .csproj 中 我遇到了一些奇怪的警告行为。 我有一个遍历枚举的 foreach 语句,枚举中的 foreach 项运行一些代码。 但是当我尝试执行此操作时,VS20
我有一个数字应用程序,它对概率的负对数做了很多工作,它(因为概率范围从零到一)取正 double 值或负无穷大(如果基础概率为零)。 我将这些与新类型 Score 一起使用如下: newtype Sc
如果我有像 5 * 5.0 这样的代码,结果将转换为最准确的类型,Double。 但这似乎不适用于这样的代码 case class Value[T : Numeric](value: T) {
Data.Text 和 Data.Vector.Unboxed Char 内部工作方式有什么区别吗?为什么我会选择其中之一而不是另一个? 我一直认为 Haskell 将 String 定义为 [Cha
在特定的上下文中,我需要管理约束值。简化;假设我需要将值限制为字符串或 64 位整数。 为了这个目的;我正在考虑声明一种结构类型,其中一个字段用于存储值的类型,一个字段用于实际值。 在这个简化的例子中
无论我登录哪个用户,因为“points”变量总是返回 0。相同的代码适用于不同的 Activity ,我看不出有什么不同。当我将鼠标悬停在 datasnapshot 上时,它表示可能会产生空指针异常,
我是一名优秀的程序员,十分优秀!