如何在Haskell中压缩玫瑰树

时间:2018-09-27 18:33:00

标签: haskell functional-programming tree

对于Haskell Tic Tac Toe游戏,我试图拉紧两棵玫瑰树。我把玫瑰树定义为

StData

我尝试了以下方法:

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 IntRose Board[Rose Int]相匹配。我不知道如何以其他任何方式压缩树木。

为了进一步说明,如果我想拉紧树木

[Rose Board]

a :> [a :> [a :> []], a :> []] ,我想返回树

b :> [b :> [b :> []], b :> []]

1 个答案:

答案 0 :(得分:5)

chibchii是树的列表,而不是树本身。您不能只致电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
--                                           ^^^^^^^