最近我开始学习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 回答
声明
基本上相当于
换句话说,
Node
是包含数据和子节点列表的数据结构 . 但是在上面的定义中,它不是叫它Node
,而是叫做:>
. 这只是一个虚构的名字; Haskell允许您创建这样的用户定义的运算符 .如果使用名称
Node
,您可以写或者,更简单地说,
由于给出的名称实际上是
:>
,因此您必须将其写为特别是,您似乎尝试使用
Rose
,但这是类型构造函数,而不是值构造函数 . 同样,你似乎试图使用“:
”运算符,但那是列表,而不是玫瑰树 .希望能为你解决一些问题 .