1

如何概括非平凡的记录更新?这是一个简单的示例,它显式地将项目引用更新为其新所有者。

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
4

1 回答 1

0

请注意,在 Haskell 中,值是不可变的,因此您不能更改owner1or的值item1

我认为您正在寻找的数据结构是Map OwnerId [Item]- 即一个映射,其键是某个所有者 ID(aStringInt),其值是项目列表(所有者拥有的项目):

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

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

于 2013-11-08T22:25:24.367 回答