Haskell奇怪的算子

时间:2015-09-21 16:25:41

标签: haskell

对于我的函数式编程课程的作业,我正在树上练习。更具体地说是玫瑰树。在我们获得数据类型的框架中,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

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

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

3 个答案:

答案 0 :(得分:10)

与列表的定义非常相似:

  • (:>)有点像(:)
  • data Rose a = a :> [Rose a]告诉您,您可以获得t :: Rose a
    • 包含元素x :: a
    • 和孩子rs :: [Rose a]
    • t = x :> rs

当然你也可以回到这样的元素:

root (x :> rs) = ... 

我希望你自己完成其余的事情;)

答案 1 :(得分:9)

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

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数据类型。

答案 2 :(得分:7)

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

此特定运算符是数据构造函数,可由第一个字符确定。数据构造函数以冒号开头。不以冒号开头的操作员是正常的功能。

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

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