最近我开始了解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):[]
这是不正确的,我不知道如何使其正确。
答案 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
,但这是类型构造函数,而不是值构造函数。同样,您似乎正在尝试使用" :
"运营商,但这是列表,而不是玫瑰树。
希望能为你解决一些问题。