Home Articles

在Haskell中获取Rose树的根

Asked
Viewed 764 times
5

最近我开始学习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 Answer

  • 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 ,但这是类型构造函数,而不是值构造函数 . 同样,你似乎试图使用“ : ”运算符,但那是列表,而不是玫瑰树 .

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

Related