对于我的函数式编程课程的作业,我正在树上练习。更具体地说是玫瑰树。在我们获得数据类型的框架中,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
我绝不需要你们告诉我应该如何制作根和儿童的功能。但是,如果你们能给我一些关于如何阅读“数据玫瑰”的提示。或者可能告诉我玫瑰树是如何建立起来的。这些东西对我来说非常有帮助,因为我喜欢做练习。
我希望有人能指出我正确的方向。
答案 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中,您可以定义自己的运算符,这是其中之一。
此特定运算符是数据构造函数,可由第一个字符确定。数据构造函数以冒号开头。不以冒号开头的操作员是正常的功能。
它与任何其他数据构造函数完全一样,唯一的区别是它以中缀形式编写,如:
。在这个程序中,它可以被读作"附加到"。
由于每个人都可以出于任何目的在自己的程序中使用它,谷歌它是没有意义的。