我可以使用矢量库的Bundle模块吗?

时间:2016-04-11 21:18:53

标签: haskell vector

简单问题:我可以在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函数将包转换回向量...我错过了什么?

1 个答案:

答案 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