我試圖在 Haskell 中撰寫一個用于線性代數運算的庫。為了能夠為矩陣和向量定義安全操作,我想在它們的型別中編碼它們的維度。經過一些研究,我發現使用 DataKinds 可以做到這一點,類似于它在這里完成的方式。例如:
data Vector (n :: Nat) a
dot :: Num a => Vector n a -> Vector n a -> a
在上述文章以及某些庫中,向量的大小是幻像型別,而向量型別本身是陣列的包裝器。在試圖弄清楚標準庫中是否存在具有型別級別大小的陣列型別時,我開始想知道陣列的底層表示。從我可以從這篇關于 GHC 記憶體布局的評論中收集到的資訊,陣列需要將它們的大小存盤在堆上,因此 3 維向量需要占用比必要的多 1 個字。當然,我們可以使用以下定義:
data Vector3 a = Vector3 a a a
如果我們只關心 3D 幾何,這可能很好,但它不允許任意大小的向量,而且它也使索引變得尷尬。
所以,我的問題是這個。在標準庫中擁有一個靜態已知大小的陣列型別不是很有用而且可能會優化記憶體嗎?據我所知,它唯一需要的是一個不同的資訊表,它將存盤大小,而不是存盤在每個堆物件中。此外,編譯器可以自動在 Array 和 SmallArray 之間進行選擇。
uj5u.com熱心網友回復:
在標準庫中擁有一個靜態已知大小的陣列型別不是很有用而且可能會優化記憶體嗎?
當然。我懷疑如果你仔細撰寫你的用例并實施它,GHC HQ 會接受補丁。不過,您可能希望先進行撰寫并仔細檢查他們是否參與其中,以避免在他們不接受的補丁上浪費時間;我當然不代表他們說話。
此外,編譯器可以自動在 Array 和 SmallArray 之間進行選擇。
我不是這里的專家,但我有點懷疑這一點。通常支持多型意味著你需要一個統一的表示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/466814.html
上一篇:作為自由單子的身份單子
下一篇:離子選擇卡片串列
