简单问题:我可以在Data.Vector.Fusion.Bundle
下使用API吗?它被认为是公共的和稳定的吗?如果是的话:是否有更多可用的信息?
一个例子是在树中编写采集操作,其中数据存储在叶子中的向量中:
data Tree a = Empty | Node a (Tree a) (Tree a) | Leaf a
toBundle Empty = B.empty
toBundle (Leaf x) = B.singleton x
toBundle (Node x l r) = toBundle l B.++ B.singleton x B.++ toBundle r
toVector t = V.unfoldrN s (\b -> Just (B.head b, B.tail b)) b
where b = toBundle t
(Just s) = B.upperBound (B.size b)
(树叶中没有矢量......想象一下:))
在我写这篇文章时,我发现没有Bundle v a -> v a
函数将包转换回向量...我错过了什么?
答案 0 :(得分:0)
我认为您正在寻找的是在data.vector.generic。(new)模块中实现的函数unstream :: Vector v a => Bundle v a -> v a
。
参考你的toVector
代码示例,我建议避免依赖为手动构造的流/包给出的大小提示,而是使用(可能)更有效的方法来构造向量,例如:使用函数:generateM :: Monad m => Int -> (Int -> m a) -> m (Vector a)
。
此外,从纯粹的概念角度来看,我想知道Leaf a
目前是否基本等同于Node a Empty Empty
,因此可能是多余的?怎么回事:type Leaf a = Node a Empty Empty
?