我剛剛發現!!運算子僅用于串列:
(!!) :: [a] -> Int -> a
所以我在 hoogle 上尋找替代品:
Foldable f => f a -> Int -> aZipList a -> Int -> a
我很驚訝沒有找到一個!
所以我問:
- 通過索引訪問 ziplist 而不將其轉換回串列的方法是什么?
- 什么hoogle搜索會找到它
當然,回答 1 對回答 2 大有幫助,因為我有型別簽名
uj5u.com熱心網友回復:
ZipList是 a newtype,所以沒有轉換。它只是同一個串列。
newtype ZipList a = ZipList { getZipList :: [a] }
正如報告在第 4.2.3 節資料型別重命名中所述,
newtype cx => T u1 … uk = N t形式的宣告引入了一種新型別,其表示與現有型別相同。
(強調我的)。當代碼運行時,ZipList標簽根本不存在。因此,
getZipList是零 成本的 無操作。
例如,將ZipList Int值視為[Int]值是完全沒問題的。觀察:
GHCi> coerce (ZipList [1,2,3] :: ZipList Int) :: [Int]
[1,2,3]
it :: [Int]
因此,資料建構式ZipList只是一個編譯時標記,我們用它宣告我們的意圖,即要使用哪個應用程式實作。具體來說,是壓縮一個,而不是嵌套回圈之一(常規[])。
至于!!它本身,應該避免。使用不斷增長的索引值重復呼叫它會導致二次行為。可以使用任意數量的高階函式來代替,或者可以根據需要對直接遞回進行編碼,逐個處理串列的元素,而無需為每個元素從頭開始重新跟蹤串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387042.html
