Haskell不可变数据结构 - Map数据类型

时间:2018-04-17 13:10:58

标签: haskell data-structures immutability key-value

我对Haskell中的这种数据类型感到困惑 - Map。特别是,有一个函数调用插入(来自Data.Map模块),它允许您将新值附加到Map数据结构。所以,这是我的困惑。如果haskell数据结构不可变,您如何将新数据插入现有的Map数据结构中?

2 个答案:

答案 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 []

每次我们定义新变量(map1map2map3)时,Map的先前版本保持完全不变。一旦我们定义了(例如)map1包含密钥"Lemon",就没有任何东西可以改变该定义。我们可以创建一个包含其他键(或更少键)的新地图,但我们无法更改map1本身。