Lösung etwa so:
relabel t xs = case t of
Leaf -> ( Leaf, xs )
Branch {} ->
let (l, ys) = relabel (left t) xs
(k, zs) = ( head ys, tail ys)
(r, ws) = relabel (right t) zs
in (Branch {left=l,key=k,right=r} , ws)
Die Teilrechnungen als Aktionen auffassen,
die jeweils ein Resultat liefern l,k,r
und einen Zustand ändern xs -> ys -> zs -> ws.
Verkettung der Zustände durch >>= einer
geeigneten Monade.