Haskell 的 Data.Text:适合用作文本编辑器的基础吗?

Posted

技术标签:

【中文标题】Haskell 的 Data.Text:适合用作文本编辑器的基础吗?【英文标题】:Haskell's Data.Text: Good to use as basis for text editor? 【发布时间】:2022-01-19 20:17:20 【问题描述】:

长期以来,我一直是一个命令式程序员,我经常回顾一下 Haskell,多玩一点,学一点。

在考虑一个可能的项目时出现了一个问题:

如何以一种将数据视为不可变的语言来实现我明确想要更改的数据?

一个特定的案例是由文本编辑器编辑的文本。 Data.Text 可用,但它表示将字符附加到文本末尾涉及复制整个文本。由于这样的事情,我想知道 Data.Text 是否是用于实现目的是改变的文本的合适结构。

是否存在解决此类问题的通用思路?

多年来,我用 C# 编写了两个文本机制的实现。一个使用了 256 个(或 512 个,我忘了,已经有一段时间了)字符的块的链接列表,类似于 Sam 文本编辑器中描述的内容。另一个是 Niklaus Wirth(从其他人那里得到的)在 Oberon 系统中完成的设计的略微修改版本,其中文本由两个文件(一个用于原始文本,另一个用于新输入的数据)和一个链接用于组合和编辑文本的片段列表。我使用了两个 .NET StringBuilders 而不是文件,只附加到它们,整个事情的性能比仅使用 StringBuilders 作为文本本身要好得多。

注意: 我对惰性、严格性、尾递归、thunk 有合理的工作知识。 Fusion对我来说不太清楚,但我读过一些。

我在 SQL 方面有丰富的经验,所以我在编译器做我不完全理解的事情时没有问题,但在那种语言中,我知道如何比在 Hasell 中更好地概念化问题。

【问题讨论】:

在很多编程语言中,strings 和 C#、Java、Python 等一样是不可变的。您可以每行使用一个 Text 以使编辑有效。 还有一个TextBuilder:hackage.haskell.org/package/text-builder-0.6.6.3/docs/… 我不是文本编辑专家,但我知道Rope 是一种用于高效编辑大字符串的众所周知的数据结构。如果我正在构建一个文本编辑器,我会研究它而不是 Text。胡歌秀a number of Rope implementations;我不知道其中哪些是“最好的”。 【参考方案1】:

Haskell 中编辑器实现的标准参考可能是Yi editor。它的作者写了一些论文讨论这个问题,例如:

“Yi:Haskell 中的 Haskell 编辑器”(DOI,PDF)

“延迟函数增量解析”(DOI,PDF)

与许多文本编辑器一样,Yi 使用rope 作为文本缓冲区的表示。具体来说,它是一个名为Yi.Rope.YiString 的纯功能绳索,包含Text 的块,定义为Data.FingerTree.FingerTree 的特化,与Data.Sequence.Seq 底层的数据结构相同。还有进一步的优化,例如将索引缓存到文本中以及对缓冲区进行批处理,但核心只是 Unicode 文本块的持久树。

使用持久性数据结构会产生对数时间成本,但会使某些功能(例如缓存历史记录和增量计算)更易于正确实现。

【讨论】:

以上是关于Haskell 的 Data.Text:适合用作文本编辑器的基础吗?的主要内容,如果未能解决你的问题,请参考以下文章

哪种 KeyBoard / KeyBoard Layout 最适合 Haskell 编程? haskell 是不是将所有数学符号作为函数?

Haskell 适合量子计算吗?

更适合阅读 Haskell 中的科学记数法

你如何在 Haskell 中安装分析库?

是否有适合维护 Cabal Haskell 包的变更日志的工具?

Haskell:在 ByteStrings 和不同的文本编码之间进行转换