Okasaki uses (essentially)
data Color = R | B
data RB a = L | T {-# UNPACK #-}!Color !(RB a) !a !(RB a)
I know that in C, the color is typically handled in a more fiddly way to save space, doing something like making the low bit of a pointer represent color (I think usually the pointer to a node encodes its color, but it would also be possible to mimic Okasaki's structure by making the left or right pointer from a node represent its color).
Obviously, such bit-fiddling is impossible in Haskell. How, then, can the nodes be represented most efficiently in Haskell?
data RB' a = L | B !(RB a) !a !(RB a) | R !(RB a) !a !(RB a)
seems likely to be reasonably memory efficient, but it also seems likely to make pattern matching rather verbose.