Haskell奇怪运算符

6

我正在为我的函数式编程课程的作业而研究关于树的练习,更具体地说是关于Rose Tree。在我们得到的框架中,数据类型“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

我并不需要你们告诉我如何制作根和子功能。但如果你们能给我一些关于如何阅读“data Rose a”行的提示,或者展示一下玫瑰树是如何构建的,那将会是很大的帮助,因为我喜欢做这些练习。
我希望有人能指点我正确的方向。
3个回答

11
这与列表的定义非常相似:
  • (:>) 有点像 (:)
  • data Rose a = a :> [Rose a] 告诉你,你可以得到一个 t :: Rose a
    • 带有元素 x :: a
    • 和子节点 rs :: [Rose a]
    • 通过 t = x :> rs
当然,你也可以像这样获取元素:
root (x :> rs) = ... 

我希望你能自己解决剩下的问题;)

1
谢谢,真的帮了大忙。是的,我现在已经掌握了根节点和子节点函数。 - mcNuggetsplays

9
:>操作符实际上是一个数据构造器。这相当于定义类型为:
data Rose a = Node a [Rose a]

(:>) = 节点。因此,使用这种替代定义,您将拥有

root :: Rose a -> a
root (Node a subnodes) = a
< p > 替代实际构造函数< code >:> 您将拥有

root ((:>) a subnodes) = a

这也可以写成

root (a :> subnodes) = a

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


7
:> 运算符没有预定义的含义。它是由Rose定义引入的,就像标识符Rose一样。在Haskell中,您可以定义自己的运算符,这就是其中之一。
这个特定的运算符是一个数据构造函数,可以通过第一个字符确定。数据构造函数以冒号开头。不以冒号开头的运算符是普通函数。
它的工作方式与任何其他数据构造函数完全相同,唯一的区别是它采用中缀形式编写,如:。在此程序中,它可以被读作“连接到”。
由于每个人都可以在他们自己的程序中使用它来实现任何目的,因此谷歌它是毫无意义的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接