在 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
,但那是 类型构造函数 ,而不是 值构造函数 .同样,您似乎正在尝试使用“:
”运算符,但这是针对列表的,而不是玫瑰树。
希望这能帮您解决一些问题。
最近我开始学习 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
,但那是 类型构造函数 ,而不是 值构造函数 .同样,您似乎正在尝试使用“:
”运算符,但这是针对列表的,而不是玫瑰树。
希望这能帮您解决一些问题。