0

Data.Tree使用列表来表示以特定节点为根的子树。是否可以有两种树类型,例如一种使用列表,另一种使用向量?我希望能够编写不关心子树如何具体表示的函数,只关心子树是可遍历的,以及利用特定子树类型的函数,例如快速索引向量。

似乎类型族将是这项工作的正确工具,尽管我以前从未使用过它们,而且我不知道如何实际定义正确的族。

如果重要的话,我没有使用容器库树实例,而是使用了类型

data Tree a b = Node a b [Tree a b] deriving (Show, Foldable, Generic)

data MassivTree a b = V a b (Array B Ix1 (MassivTree a b))

后者使用来自massiv的向量。

4

1 回答 1

5

您可以使用类型类 - 实际上您需要的类型类可能已经存在。

考虑一下:

data Tree t a = Tree a (t (Tree t a))

Argumentt是一种高级类型,它表示as 的容器。

现在定义一组树操作,约束Traversable如下:

:: (Foldable t) => Tree t a -> b

您现在可以创建和操作使用任何Foldable. 您需要为您想要的一组操作选择正确的类型类 -Functor可能就足够了,或者Traversable如果您正在使用单子操作进行任何操作,您可能需要。您可以根据每个功能选择类型类,具体取决于它的作用。

您现在可以Tree像这样定义类型:

type ListTree a = Tree [] a
type MassivTree r ix a = Tree (Array r ix) a

您还可以定义特定于实例的函数,并可以访问全部功能:

:: ListTree a -> b
-- or
:: Tree [] a -> b

快乐哈斯克尔!

于 2021-04-22T12:02:30.270 回答