Как поменять местами детей на Haskell? - PullRequest
1 голос
/ 04 февраля 2020

Я довольно новичок в Haskell. То, что я пытаюсь сделать, это поменять порядок детей на дереве. Я не уверен, как заставить мой код поменять местами двух детей, если они оба целые. Спасибо!

# For example:
# If t1 = (* (+ 20 1) (- 10 8))
# Then when I call 'swap t1' I should get (* (- 8 10) (+ 1 20)) but I get (* (- 10 8) (+ 20 1))

#Here is my code:
data Tree =
     TInt Integer
   | TOp String Tree Tree

t1 = TOp "*" (TOp "+" (TInt 20) (TInt 1))
             (TOp "-" (TInt 10) (TInt 8))

swap :: Tree -> Tree
swap (TInt i) = TInt i
swap (TOp s first second) = TOp s second first

1 Ответ

4 голосов
/ 04 февраля 2020

Ты почти там, но ты не идешь до конца. Вторая строка 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...