读取代码声明和定义,以便在不使用GHCi的情况下获取表达式的结果

时间:2016-10-19 20:14:10

标签: haskell

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 

1 个答案:

答案 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 = idq = lengthx = "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)).

现在继续。