長期以來一直是命令式程式員,我時常回顧 Haskell,多玩一點,多學習一點。
在考慮一個可能的專案時出現了一個問題:
如何使用將資料視為不可變的語言來實作我明確想要更改的資料?
一種特殊情況是由文本編輯器編輯的文本。Data.Text 可用,但它表示將字符附加到文本末尾涉及復制整個文本。由于這樣的事情,我想知道 Data.Text 是否是用于實作旨在更改的文本的適當結構。
是否有解決此類問題的通用思維?
多年來,我用 C# 撰寫了兩個文本機器的實作。一個使用了 256 個(或 512 個,我忘了,已經有一段時間)字符塊的鏈接串列,類似于 Sam 文本編輯器中描述的內容。另一個是 Niklaus Wirth(從其他人那里得到的)在 Oberon 系統中完成的設計的略微修改版本,其中文本由兩個檔案實作(一個用于原始文本,另一個用于新輸入的資料)和一個鏈接用于組合和編輯文本的片段串列。我使用了兩個 .NET StringBuilders 而不是檔案,只附加到它們,并且整個事情的性能比僅使用 StringBuilders 作為文本本身要好得多。
注意:我對懶惰,嚴格,尾遞回,重擊有合理的作業知識。Fusion 對我來說不太清楚,但我已經閱讀了一些。
我在 SQL 方面有很好的經驗,所以我對編譯器做我不完全理解的事情沒有問題,但是在這種語言中,我知道如何比在 Hasell 中更好地概念化問題。
uj5u.com熱心網友回復:
Haskell 中編輯器實作的標準參考可能是Yi 編輯器。它的作者寫了一些討論這個的論文,例如:
“Yi:Haskell 中的 Haskell 編輯器”(DOI,PDF)
“懶惰的函式增量決議”(DOI,PDF)
像許多文本編輯器一樣,Yi 使用繩索作為文本緩沖區的表示。具體來說,它是一個純功能的繩索,稱為Yi.Rope.YiString包含 的塊Text,定義為 的特化Data.FingerTree.FingerTree,底層相同的資料結構Data.Sequence.Seq。還有進一步的優化,例如將索引快取到文本中和在緩沖區上批處理操作,但核心只是 Unicode 文本塊的持久樹。
使用持久資料結構會產生對數時間成本,但可以使某些功能(例如快取歷史和增量計算)更容易正確實作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387001.html
下一篇:多個匯入行在ghci中產生錯誤
