Muy bien imprimiendo / mostrando un árbol binario en Haskell

Tengo un tipo de datos de árbol:

data Tree a b = Branch b (Tree a b) (Tree a b) | Leaf a

... y necesito que sea una instancia deShow, sin usoderiving. Descubrí que es muy fácil exhibir una pequeña rama con dos hojas:

instance (Show a, Show b) => Show (Tree a b) where
   show (Leaf x) = show x
   show (Branch val l r) = " " ++ show val ++ "\n" ++ show l ++ "  " ++ show r

Pero, ¿cómo puedo extender una estructura agradable a un árbol de tamaño arbitrario? Parece que determinar el espacio requiere que sepa cuántas hojas quedarán en la parte inferior (o tal vez cuántas hojas hay en total) para poder asignar todo el espacio que necesito allí y seguir trabajando. ' Probablemente necesitaría llamar a una función de tamaño. Puedo ver que esto es viable, pero ¿eso lo hace más difícil de lo que es?

Respuestas a la pregunta(2)

Su respuesta a la pregunta