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.