我一直在嘗試學習 Haskell,所以對于第一個實質性專案,我正在嘗試為一些二進制格式撰寫決議庫,但我遇到了各種障礙,不知道如何繼續 - 警告,新手在這里。對于我剩下的問題,假設我們正在使用像 Attoparsec 這樣的一元決議庫。還假設要決議的整個位元組串都在記憶體中(它不是很長,在千位元組的數量級),所以不需要處理惰性位元組串或惰性輸入。
所以二進制格式大致是這樣的:
- 一個(固定寬度)主塊。
- 一系列(固定寬度)二級塊。
- 一系列(固定寬度)塊——稱它們為 ops。
它們通過以下方式拼接在一起:主塊包含輔助塊和操作的數量,以及它們的位元組串偏移量。主塊和輔助塊都可以附加一系列操作。組織的方式是計算運算元和操作序列的索引。我想將整個內容決議為固定寬度部分的記錄,以及主塊和輔助塊都攜帶的附加操作塊的操作向量。但是我應該如何組織對 ops 向量的決議呢?我的第一個想法是,關于決議序列的一般高級概述:
- 將主塊決議為記錄。
- 注意 ops 塊的偏移量和 ops 的數量。
- 使用 2.,向前看并將操作塊決議為操作串列。
- 從此串列中填充主塊的操作向量。
- 將輔助塊決議為記錄,使用操作串列填充它們自己的操作塊。
想法?有沒有更好的方法來組織決議器,也許可以利用一些我不知道的組合器?任何額外的資訊只是問。
uj5u.com熱心網友回復:
我會盡量避免任何被描述為“前瞻”的事情。按順序決議檔案。一種方法是為“主塊,索引進入操作串列”和“主塊,行內操作”設定不同的型別。首先決議為第一種型別,然后在決議操作后對其進行更新。
data Main op = Main { numSecondary, numOps :: Int,
ops :: [op]
}
main :: Parser (Main Int)
main = do
ns <- int
no <- int
Main ns no <$> replicateM no int
file :: Parser (Main Op, [Secondary Op])
file = do
Main ns no mainOps <- main
secs <- replicateM ns secondary
ops <- replicateM no op
pure ( Main ns no (map (ops !!) mainOps),
map (inflateSecondary ops) secs
)
inflateSecondary :: Secondary Int -> Secondary Op
inflateSecondary = undefined
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/525818.html
標籤:解析哈斯克尔
上一篇:使用BeautifulSoup從位于具有特定類的Div中的<a>標記中獲取href
下一篇:嵌套結構的基本決議結構?
