data Tree a b = Branch b (Tree a b) (Tree a b) | Leaf a
myorder :: (a -> c) -> (b -> c) -> Tree a b -> [c]
myorder p q (Leaf x) = [p x]
myorder p q (Branch x l r) = myorder p q l ++ [q x] ++ myorder p q r
tree1 = Branch "Hi"
(Branch "All" (Leaf (1::Int)) (Leaf (2::Int)))
(Leaf (3::Int))
问题:以下表达式的结果是什么?
> myorder id length tree1
我正在攻读考试,我想更好地了解如何在没有GHCi的情况下获得输出,因为当然我们必须手工完成,而且我真的想看看我该如何去做它。答案是[1,3,2,2,3] 如果有人能指导我,那就太棒了 我也像这样画出了tree1:
"Hi"
/ \
"All" 3
/ \
1 2
答案 0 :(得分:1)
我们需要评估
myorder id length (Branch "Hi"
(Branch "All" (Leaf (1::Int)) (Leaf (2::Int)))
(Leaf (3::Int)))
尝试按从上到下的顺序应用方程式。
myorder p q (Leaf x) = [p x]
此等式不适用,因为参数Branch "Hi" ... ...
不是Leaf x
形式。
myorder p q (Branch x l r) = myorder p q l ++ [q x] ++ myorder p q r
这个等式确实适用。我们有p = id
,q = length
,x = "Hi"
,
l = Branch "All" (Leaf (1::Int)) (Leaf (2::Int)),
r = Leaf (3::Int).
因此,在右侧替换这些,表达式变为
myorder id length (Branch "All" (Leaf (1::Int)) (Leaf (2::Int)))
++ [length "Hi"]
++ myorder id length (Leaf (3::Int)).
现在继续。