我对Haskell中的这种数据类型感到困惑 - Map。特别是,有一个函数调用插入(来自Data.Map模块),它允许您将新值附加到Map数据结构。所以,这是我的困惑。如果haskell数据结构不可变,您如何将新数据插入现有的Map数据结构中?
答案 0 :(得分:6)
insert
实际上并未修改输入Map
。它会返回 new Map
,其中包含与原始Map
相同的条目,以及您要插入的条目。
在幕后,编译器可能实际上不必将所有旧条目复制到新的Map
;如果确定没有其他内容使用输入Map
,它可以重用原始文件。不可变性是语言的属性,不一定是该语言的实现。
答案 1 :(得分:0)
也许一个例子会让这个更清楚。
Prelude> let map1 = empty
Prelude> map1
fromList []
Prelude> let map2 = insert "Lemon" 6 map1
Prelude> map2
fromList [("Lemon", 6)]
Prelude> map1
fromList []
Prelude> let map3 = insert "Lime" 7 map2
Prelude> map3
fromList [("Lime", 7), ("Lemon", 6)]
Prelude> map2
fromList [("Lemon", 6)]
Prelude> map1
fromList []
每次我们定义新变量(map1
,map2
,map3
)时,Map
的先前版本保持完全不变。一旦我们定义了(例如)map1
包含密钥"Lemon"
,就没有任何东西可以改变该定义。我们可以创建一个包含其他键(或更少键)的新地图,但我们无法更改map1
本身。