Function 将函数表示为树

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 =

我正在做一份过去的函数编程试卷,有一个问题:

这里有两种基本上相同的表达方式:

f(g(x,y),z,h(t))

f(gxy)z(ht)

(a) 通过将两个表达式绘制为两种不同的树来说明它们的不同结构

(b) 定义Haskell数据类型Bush a和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)
——它们在你的原始帖子中几乎是正确的。