【问题标题】:Get the root of a Rose tree in Haskell在 Haskell 中获取玫瑰树的根
【发布时间】:2015-10-21 23:43:21
【问题描述】:

最近我开始学习 Haskell,并且正在努力进行以下练习:

编写函数 root :: Rose a -> a 和 children :: Rose a -> [Rose a] 返回存储在玫瑰树根部的值,分别是 玫瑰树的根。

他们给了我以下基本代码来开始:

数据玫瑰 a = a :> [玫瑰 a] 推导 (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):[]

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

【问题讨论】:

    标签: haskell tree


    【解决方案1】:

    声明

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

    希望这可以为您解决一些问题。

    【讨论】:

    • 感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2012-06-07
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多