在 Haskell 中获取玫瑰树的根

Get the root of a Rose tree in Haskell

最近我开始学习 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 和 returns Rose a,但我仍然迷茫下一步该做什么。

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

root (Rose a) = a 

children :: Rose a -> [Rose a]的函数:

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

这不正确,我不知道如何使它正确。

宣言

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,但那是 类型构造函数 ,而不是 值构造函数 .同样,您似乎正在尝试使用“:”运算符,但这是针对列表的,而不是玫瑰树。

希望这能帮您解决一些问题。