Haskell:如何使用这个数据结构

5

我需要在一个作业中使用代码,该代码包含以下数据结构:

data Rose a =  a :> [Rose a]

然而,我不知道如何使用这个数据结构,例如:如何创建一个它的实例以及如何循环遍历它?

如果有人能帮助我解决这个问题。

1个回答

6
这种数据类型的构造函数是(:>),它的类型是(:>) :: a -> [Rose a] -> Rose a。你可以像下面这样使用它来构造值。
> 1 :> [] :: Rose [Int]
1 :> []
> 1 :> [2 :> [], 3 :> [1 :> []]] :: Rose [Int]
1 :> [2 :> [], 3 :> [1 :> []]]

它在功能上等同于

data Tree a = Node a [Tree a]

使用不同的名称,即Tree <=> RoseNode <=> :>

如果您想要一个Functor实例,您需要执行以下操作:

instance Functor (Rose a) where
    -- fmap :: (a -> b) -> Rose a -> Rose b
    fmap f (a :> rest) = (f a) :> (map (fmap f) rest)

1
谢谢,你的答案完美地回答了我的问题。 - Skyfe
1
或者只需启用DeriveFunctor扩展并“派生Functor” :) - daniel gratzer
1
(:>)是什么数据类型?你能指出一些相关链接吗?(我第一次看到这个。) - Sibi
@Sibi (:>)是一个具有上述类型的数据构造器。定义已在问题中给出。它是Haskell中的任何其他数据构造器,只不过它是一个中缀运算符而不是前缀函数。它不是一种类型,而是类型Rose a的构造器。 - bheklilr
1
@bheklilr 谢谢。 :) 我以为那个符号是Haskell中预定义的数据构造函数。 - Sibi

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