that is _not_ possible in haskell, simply.
generateUUID needs a random number generator, thus it probably has a type like
generateUUID :: IO UUID
which means that those two lines don't _really_ make sense: you'd get a compile error. to use side effects (which in this case, IO, mostly means opting into sequencing of actions) you'd have to write
uuidY <- generateUUID
y = bar uuidY
uuidZ <- generateUUID
z = bar uuidZ
in which case, equational reasoning still holds.
Side-note: in haskell, you could write it while avoiding the middle line using either the left or right bind operators, so you could write it as
y = bar =<< generateUUID
z = generateUUID >>= bar
(mnemonically: the first one runs an action and pipes it to the left, the second one does the same but pipes to the right)
Side-note #2: that's actually not too far away from how random number generators work in haskell: either you pass the state around, or you do it in IO.
Side-note #2: that's actually not too far away from how random number generators work in haskell: either you pass the state around, or you do it in IO.