我正在编写过去的函数编程试卷,并提出这个问题:
以下是两种基本相同的表达方式:
f(g(x,y),z,h(t))
f(g x y)z(h t)
(a)通过将两个表达式绘制为两种不同的树来说明这两种表达式的不同结构。
(b)定义Haskell数据类型Bush a和Tree a来捕获两个不同的结构。
我有点卡住,因为我在课程中从未做过这样的事情。从后面的部分可以看出,第一个表达式应该由Tree a
表示,第二个表达式应该由Bush a
表示,但我真的不知道从哪里开始。我想到了类似的东西:
data Tree a = Leaf a | Node (Tree a) (Tree a)
data Bush a = Node a [Bush a]
但我不认为二叉树类型是正确的使用方式。有人能指出我正确的方向吗?
答案 0 :(得分:4)
实际上,第一个表达式由Bush
表示,第二个表达式由Tree
表示。
在Haskell中,g x y
表示g x
已应用于y
;在C中,g(x, y)
表示g
应用于参数集合 - {x, y}
。因此,在C:
f(g(x,y),z,h(t)) = Bush f [Bush g [Bush x [], Bush y []], Bush z [], Bush h [Bush t []]]
f
+--g
| +--x
| +--y
|
+--z
|
+--h
+--t
在哈斯克尔:
f (g x y) z (h t) = App (App (App f (App (App g x) y)) z) (App h t)
+
/ \
/ /\
+ h t
/ \
/\ z
f +
/ \
/\ y
g x