Как застегнуть розовые деревья в Хаскеле - PullRequest
0 голосов
/ 27 сентября 2018

Для игры на Haskell Tic Tac Toe я пытаюсь собрать две Розы.Я определил розовое дерево как

data Rose a = a :> [Rose a]

Я попробовал следующее:

zipTrees :: Rose Board -> Rose Int -> Rose (Board, Int)
zipTrees (b :> []) (i :> []) = (b,i) :> []
zipTrees (b :> chib) (i :> chii) = (b, i) :> zipTrees chib chii

, но возникает ошибка, поскольку он не может соответствовать ожидаемым типам Rose Int и Rose Board с [Rose Int] и [Rose Board] соответственно.Я не знаю, как сжать деревья любым другим способом.

Чтобы проиллюстрировать это, если я хочу сжать деревья

a :> [a :> [a :> []], a :> []]

и b :> [b :> [b :> []], b :> []], я хочу вернутьдерево

(a, b) :> [(a, b) :> [(a, b) :> []], (a,b) :> []]

1 Ответ

0 голосов
/ 27 сентября 2018

chib и chii - это списки деревьев, а не сами деревья.Вы не можете просто позвонить им zipTrees.Вам нужно будет либо набрать

zipTrees :: Rose Board -> Rose Int -> Rose (Board, Int)
zipTrees (b :> [])       (i :> _)        = …
zipTrees (b :> _)        (i :> [])       = …
zipTrees (b :> (cb:cbs)) (i :> (ci:cis)) = …

, либо просто использовать zipWith

zipTrees :: Rose Board -> Rose Int -> Rose (Board, Int)
zipTrees (b :> chib) (i :> chii) = (b, i) :> zipWith zipTrees chib chii
--                                           ^^^^^^^
...