如何在Haskell中表示和更新双向引用?

时间:2013-11-08 21:42:42

标签: haskell data-structures records

如何概括非平凡的记录更新?以下是明确更新对其新所有者的项目引用的简单示例。

data Owner = Owner {
        items :: [Item]
          } deriving (Show)

data Item = Item {
        name :: String,
        owner :: Owner
          }   

instance Show Item where
        show (Item name _) = name

item1 = Item "a" owner1
item2 = Item "b" owner1
item3 = Item "c" owner1
owner1 = Owner [item1,item2,item3,Item "d" owner1]

owner2 = Owner $ map (\(Item n o) -> Item n owner2) $ items owner1

1 个答案:

答案 0 :(得分:0)

请注意,在Haskell中,值是不可变的,因此您无法更改owner1item1的值。

我认为您要查找的数据结构是Map OwnerId [Item] - 即其键是某个所有者ID(StringInt)并且其值为项目列表的地图(所有者拥有的物品):

type OwnerId = Int -- or String
data Item = Item { owner :: OwnerId, name :: String }

type WhoOwnsWhat = Map OwnerId [Item]

当您更改项目的所有者时,您实际上是通过使用新的项目列表更新两个地图条目来创建新地图。要重新分配项目,您需要指定谁拥有什么,项目和新所有者的当前地图,并获取谁拥有什么的新地图:

changeOwner :: WhoOwnsWhat -> Item -> OwnerId -> WhoOwnsWhat

添加新项目涉及以下功能:

addItem :: WhoOwnsWhat -> Item -> WhoOwnsWhat

请注意,在每种情况下,我们都会创建一个新地图。