在Haskell中获取Rose树的根

时间:2015-07-30 14:37:42

标签: haskell tree

最近我开始了解Haskell,并且正在努力进行以下练习:

Write functions root :: Rose a -> a and children :: Rose a -> [Rose a]
that return the value stored at the root of a rose tree, respectively the children of the
root of a rose tree.

他们给了我以下基本代码:

data Rose a = a :> [Rose a]
    deriving (Eq, Show)

我不知道(>>)的含义。我试着通过输入ghci

来理解它
Input: :t (:>)
Output: a -> [Rose a] -> Rose a

所以我认为这意味着您有一个a值,该值将用于从列表中查找Rose a并返回Rose a,但我仍然感到困惑接下来做什么。

如果我查看root :: Rose a -> a的签名,该函数将如下所示:

root (Rose a) = a 

children :: Rose a -> [Rose a]的功能:

children (Rose a) = (Rose a):[]

这是不正确的,我不知道如何使其正确。

1 个答案:

答案 0 :(得分:12)

声明

data Rose a = a :> [Rose a]

基本等同于

data Rose a = Node a [Rose a]

换句话说,Node是一个包含数据和子节点列表的数据结构。但在上面的定义中,它不是称之为Node,而是称为:>。它只是一个虚构的名字; Haskell允许您创建这样的用户定义运算符。

如果使用了名称Node,您可以写

root (Node datum children) = datum

或者更简单地说,

root (Node a rs) = a

由于给出的名称实际上是:>,因此您必须将其写为

root (a :> rs) = a

特别是,您似乎尝试使用Rose,但这是类型构造函数,而不是值构造函数。同样,您似乎正在尝试使用" :"运营商,但这是列表,而不是玫瑰树。

希望能为你解决一些问题。