如何概括非平凡的记录更新?以下是明确更新对其新所有者的项目引用的简单示例。
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
答案 0 :(得分:0)
请注意,在Haskell中,值是不可变的,因此您无法更改owner1
或item1
的值。
我认为您要查找的数据结构是Map OwnerId [Item]
- 即其键是某个所有者ID(String
或Int
)并且其值为项目列表的地图(所有者拥有的物品):
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
请注意,在每种情况下,我们都会创建一个新地图。