[英]Map which must contain all possible keys?
Haskell有多個數據結構,如Map key value
,在內部使用樹或哈希映射。 使用此數據結構時,可能在執行查找時,密鑰將不存在。
在我的用例中,可能鍵的集合是有限的(技術上它們在Enum
和Ord
)並且我只對存在所有鍵的映射感興趣。
如何創建一個類似於地圖的數據結構,保證地圖中存在所有鍵,即它可以具有非部分函數lookup :: Map key value -> key -> value
(可能具有key
類型的約束, Ord
或Hashable
還是其他什么東西)? 有沒有這樣的東西?
換句話說:我想要一個只有在插入所有可能的密鑰時才能查詢的數據結構。 我可以使用帶有fromMaybe
常規Map
,但我不想指定默認值 - 我想在類型級別保證永遠不需要默認值。
您正在尋找的結構只是一個功能: Key -> Value
。 您可以使用以下內容插入 (或實際替換)值
insert :: (Key -> Value) -> Key -> Value -> (Key -> Value)
insert f k v k' = if k == k' then v else f k'
keys
和values
函數實現起來很簡單(只需要將Key類型作為Enum
)。 編譯器可以警告您函數是否是部分函數(最終,您使用的是哪種數據結構,您無法阻止某人插入undefined
值)。
你應該研究一種稱為memo(ization)嘗試的技術 。 函數類型A -> B
的備忘錄是一種數據類型,它表示該類型的函數作為記錄所有參數/結果組合的數據結構。 您可以瀏覽一些鏈接:
但是長話短說,Haskell中的備忘錄試圖以懶惰的方式構建,可能是無限的搜索樹,其中每個鍵的值通過應用我們正在記憶的函數來計算。
備忘錄嘗試可能並不完全符合您的要求,但這種技術很有可能適應您的目標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.