Function 将函数表示为树
我正在做一份过去的函数编程试卷,有一个问题: 这里有两种基本上相同的表达方式: f(g(x,y),z,h(t)) f(gxy)z(ht) (a) 通过将两个表达式绘制为两种不同的树来说明它们的不同结构 (b) 定义Haskell数据类型Bush a和Tree a以捕获这两种不同的结构 我有点困了,因为在我的课程中我从来没有做过这样的事情。从后面的部分可以很明显地看出,第一个表达式应该由Function 将函数表示为树,function,haskell,tree,Function,Haskell,Tree,我正在做一份过去的函数编程试卷,有一个问题: 这里有两种基本上相同的表达方式: f(g(x,y),z,h(t)) f(gxy)z(ht) (a) 通过将两个表达式绘制为两种不同的树来说明它们的不同结构 (b) 定义Haskell数据类型Bush a和Tree a以捕获这两种不同的结构 我有点困了,因为在我的课程中我从来没有做过这样的事情。从后面的部分可以很明显地看出,第一个表达式应该由树a表示,第二个表达式由树a表示,但我真的不知道从这里可以走到哪里。我猜是这样的: data Tree a =
树a
表示,第二个表达式由树a
表示,但我真的不知道从这里可以走到哪里。我猜是这样的:
data Tree a = Leaf a | Node (Tree a) (Tree a)
data Bush a = Node a [Bush a]
但是我不认为二叉树类型是正确的。有人能给我指出正确的方向吗?事实上,第一个表达式由
Bush
表示,第二个表达式由Tree
表示
在Haskell中,Gxy
表示Gx
应用于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
实际上,第一个表达式由
Bush
表示,第二个表达式由Tree
表示
在Haskell中,Gxy
表示Gx
应用于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
真正地在第(c)部分中,问题要求我创建一个函数
curry::Bush a->Tree a
,第二个函数肯定是未经编码的表达式,因此必须是Bush a
?查看curry
:((a,b)->c)->a->b->c
。它将“C”函数变成了“Haskell”函数,也就是说,从灌木丛到树。啊,对了。所以我在第一次回复中给出的定义应该是相反的?定义是data Bush a=Leaf a | Node a[Bush a]
和data Tree a=Leaf a | Node(Tree a)(Tree a)
——它们在你最初的帖子中几乎是正确的。真的吗?在第(c)部分中,问题要求我创建一个函数curry::Bush a->Tree a
,第二个函数肯定是未经编码的表达式,因此必须是Bush a
?查看curry
:((a,b)->c)->a->b->c
。它将“C”函数变成了“Haskell”函数,也就是说,从灌木丛到树。啊,对了。所以我在第一次回复中给出的定义应该是相反的?定义是data Bush a=Leaf a | Node a[Bush a]
和data Tree a=Leaf a | Node(Tree a)(Tree a)
——它们在你的原始帖子中几乎是正确的。