data Name = Name String String
data Address = Address { city :: String, street :: String }
data Person = Person { name :: Name, address :: Address }
p1 = Person (Name "John" "Doe") (Address "London" "Trafalgar square 2")
p2 = p1 { address = (address p1) { street = "Trafalgar square 3" } }
Vagy még egyszerűbben és szebben lencsékkel (p2 = p1.address.street~="Trafalgar square 3" azt hiszem, de nem értek hozzá). Amúgy nem konkrétan ez a példa hozta ki belőlem az undort, csak megint eszembe jutott, hogy ADT-t definiálni milyen szar Scalaban; Trait, meg case class / object, stb. stb. Itt is .copy, etc.