Ты почти там, но ты не идешь до конца. Вторая строка swap
заменяет немедленные дочерние элементы дерева верхнего уровня (от first second
до second first
), но если у first
и / или second
есть дополнительные дочерние элементы под ними эти дети останутся незамеченными, потому что вы никоим образом не изменяете ни first
, ни second
.
Интересно, как поменять местами все дочерние элементы first
и second
? ? Ну, оба они имеют тип Tree
... Если бы только была функция, которая принимает Tree
, меняет свои дочерние элементы и возвращает еще один Tree
... Ой, подождите! Это наша swap
функция! Почему бы нам не использовать его, чтобы поменять местами всех детей first
и second
?
swap (TOp s first second) = TOp s (swap second) (swap first)