
You can do this, but with some caveats; the technique is called tying the knot [1]. However, if you decide to go subsequently change an Artist, any recursive references to it must be updated too, and you will get very slow update.
collection = MusicCollection [direStraits, sting] direStraits = Artist "Dire Straits" [brothersInArms] brothersInArms = Album "Brothers in Arms" [moneyForNothing] moneyForNothing = Track "Money for Nothing" [direStraits]
Is fine, laziness stops the infinite loop. Related to editing values embedded deep in structures, but not related to cross-references, you might find this post interesting: http://conal.net/blog/posts/semantic-editor-combinators/ Cheers, Edward [1] http://www.haskell.org/haskellwiki/Tying_the_Knot