
Hello all, I recently tried to model "Items", where an Item can either be inside another Item or at a certain location. I started like this: data Location i l = At l | In (Item i l) deriving (Eq, Show) data Item i l = Itm i (Location i l) deriving (Eq, Show) type ItemDb i l = [Item i l] ex_itemdb = let i1 = Itm 1 (At "a") i2 = Itm 2 (In i1) in [i1, i2] Now I wanted to move Item 1 to a different location using this code: moved = fmap f ex_itemdb where f (Itm 1 (At "a")) = (Itm 1 (At "b")) f x = x Not this does not do what I want. I get -- *Main> ex_itemdb -- [Itm 1 (At "a"),Itm 2 (In (Itm 1 (At "a")))] -- *Main> moved -- [Itm 1 (At "b"),Itm 2 (In (Itm 1 (At "a")))] While Item 1 has moved to "b" Item 2 still claims to be in an "Itm 1 (At "a")". I understand what's going on here and coming from a DB background I can see that the redundant data is the root of the problem. I can model this in a relational way such that the redundancy is avoided. But maybe there is a more haskellish/idiomatic way to acomplish this. Is there?