2017-10-10 139 views
1

我是新来的Haskell和一直在试图建立一个荏苒功能,与具有以下数据结构树的工作原理:哈斯克尔:问题荏苒树

data Tree a = Leaf | Node a (Tree a) (Tree a) deriving Show 

到目前为止,我有这样的:

treezip :: (Tree a) -> (Tree b) -> (Tree(a,b)) 
treezip (Node a leftSubtreea rightSubtreea) (Node b leftSubtreeb rightSubtreeb) = 
let l = treezip leftSubtreea leftSubtreeb 
    r = treezip rightSubtreea rightSubtreeb 
in Node a l r 

但是,无论何时我尝试将模块加载到GHCi中,我都会收到错误,指向代码的最后一行,并且特别注意变量a

我一直在试图弄清楚为什么这不起作用。任何帮助,将不胜感激

+1

提示:节点在压缩后应该存储的值应该是多少? –

+0

“节点”应该在压缩后存储“内部”值。 –

+1

@ J.Doe“Int”从哪里来? 'treezip'需要存储任意数据的两棵树,并生成一个包含*元组数据*的树。如果我有一个Tree Char值和一个Tree Bool值,我必须产生一个Tree(Char,Bool)值。那么,'treezip(Node'c'Leaf Leaf)(Node'True'Leaf Leaf)'应该返回什么? – chepner

回答

4

不要针对编译器,让它帮助你!

向右像这样的功能,这是最好的,只有一个“外壳定义”开始了:

treeZip (Node a lSa rSa) (Node b lSb rSb) = Node _ _ _ 

编译器会回来这个:

• Found hole: _ :: (a, b) 
    Where: ‘a’ is a rigid type variable ...(_bla, bla_) 
     ‘b’ is a rigid type variable .... 
• In the first argument of ‘Node’, namely ‘_’ 
    In the expression: Node _ _ _ 
    In an equation for ‘treeZip’: 
     treeZip (Node a lSa rSa) (Node b lSb rSb) = Node _ _ _ 
• Relevant bindings include 
    rSb :: Tree b (bound at /tmp/wtmpf-file20584.hs:4:38) 
    lSb :: Tree b (bound at /tmp/wtmpf-file20584.hs:4:34) 
    b :: b (bound at /tmp/wtmpf-file20584.hs:4:32) 
    rSa :: Tree a (bound at /tmp/wtmpf-file20584.hs:4:21) 
    lSa :: Tree a (bound at /tmp/wtmpf-file20584.hs:4:17) 
    a :: a (bound at /tmp/wtmpf-file20584.hs:4:15) 

所以,告诉你第一个_打孔应该填充(a,b)类型的东西。我们有这种类型的东西吗?那么,我们可以轻松地构建它,即将ab并将它们放在一个元组中!

treezip (Node a lSa rSa) (Node b lSb rSb) = Node (a,b) _ _ 

...给

• Found hole: _ :: Tree (a, b) 
    Where: ‘a’ is a rigid type variable bound by... 

是啊,你已经解决了一个 - 它应该是子树的拉链。

treeZip (Node a lSa rSa) (Node b lSb rSb) 
    = Node (a,b) (treeZip lSa lSb) (treeZip rSa rSb)