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

owner1Haskell では値は不変であるため、またはの値を変更できないことに注意してくださいitem1

あなたが探しているデータ構造は次のとおりだと思いますMap OwnerId [Item]-つまり、キーが所有者ID(StringまたはInt)であり、値がアイテムのリスト(所有者が所有するアイテム)であるマップ:

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

type WhoOwnsWhat = Map OwnerId [Item]

アイテムの所有者を変更すると、アイテムの新しいリストで 2 つのマップ エントリを更新することにより、実際には新しいマップが作成されます。アイテムを再割り当てするには、誰が何を所有しているかの現在のマップ、アイテムと新しい所有者を指定し、誰が何を所有しているかの新しいマップを取得します。

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

新しいアイテムの追加には、次のような関数が含まれます。

addItem :: WhoOwnsWhat -> Item -> WhoOwnsWhat

いずれの場合も、新しいマップを作成していることに注意してください。

于 2013-11-08T22:25:24.367 に答える