【问题标题】:Haskell Strange OperatorHaskell 奇异运算符
【发布时间】:2015-09-22 01:06:35
【问题描述】:

对于我的函数式编程课程的作业,我正在做一个关于树的练习。更具体地说是在玫瑰树上。在我们得到数据类型'Rose'的框架中已经定义了,但是它有一个操作符:>。我在hoogle上搜索它,它说它是序列的最右边的元素和序列的其余部分。 (下面部分框架)

data Rose a = a :> [Rose a]
deriving (Eq, Show)

-- Exercise 1

root :: Rose a -> a
root = undefined

children :: Rose a -> [Rose a]
children = undefined

我绝不需要你们告诉我应该如何制作根和子功能。但是,如果你们能给我一些关于如何阅读“数据玫瑰”行的提示,或者告诉我如何建立一棵玫瑰树。这些东西对我来说非常有帮助,因为我喜欢做练习。

我希望有人能指出我正确的方向。

【问题讨论】:

    标签: haskell


    【解决方案1】:

    t 非常类似于列表的定义:

    • (:>) 有点像(:)
    • data Rose a = a :> [Rose a] 告诉你,你可以得到一个t :: Rose a
      • 带有元素x :: a
      • 和孩子们rs :: [Rose a]
      • t = x :> rs

    当然你也可以像这样取回元素:

    root (x :> rs) = ... 
    

    希望你自己搞定剩下的 ;)

    【讨论】:

    • 谢谢,真正的大帮助。是的,我现在已经关闭了 root 和 children 功能。
    【解决方案2】:

    :> 运算符实际上是一个数据构造函数。相当于将类型定义为

    data Rose a = Node a [Rose a]
    

    在哪里(:>) = Node。因此,使用此替代定义,您将拥有

    root :: Rose a -> a
    root (Node a subnodes) = a
    

    替换实际的构造函数 :> 你会拥有

    root ((:>) a subnodes) = a
    

    也可以写成

    root (a :> subnodes) = a
    

    正如@Carsten 所说,它就像列表构造函数:,只是专门用于Rose 数据类型。

    【讨论】:

      【解决方案3】:

      :> 运算符没有预定义的含义。它由您的 Rose 定义引入,就像标识符 Rose 一样。在 Haskell 中,您可以定义自己的运算符,这就是其中之一。

      这个特殊的操作符是一个数据构造器,可以由第一个字符来确定。数据构造函数以冒号开头。不以冒号开头的运算符是普通函数。

      它的工作方式与任何其他数据构造函数完全一样,唯一的区别是它是以中缀形式编写的,例如:。在这个程序中,它可以读作“附加到”。

      由于每个人都可以在自己的程序中出于任何目的使用它,所以用 google 搜索它是没有意义的。

      【讨论】:

        猜你喜欢
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        • 2022-07-13
        • 2014-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多