对于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 Int
与Rose Board
和[Rose Int]
相匹配。我不知道如何以其他任何方式压缩树木。
为了进一步说明,如果我想拉紧树木
[Rose Board]
和a :> [a :> [a :> []], a :> []]
,我想返回树
b :> [b :> [b :> []], b :> []]
答案 0 :(得分:5)
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
-- ^^^^^^^