问题 如何将Haskell Traversable转换为Vector?


如果我有 Traversable 例如, xs,我该如何将其转换为 Vector


8491
2018-04-25 01:20


起源



答案:


所有 Traversable 实例也是 Foldable,所以你可以写类似的东西

toVector :: Foldable t => t a -> Vector a
toVector = Vector.fromList . Foldable.toList
{-# INLINE toVector #-}

这可能会成为一个中间列表,如果这不会被融合掉。内联应该有助于使融合更有可能。


11
2018-04-25 01:27



我只是一个镜头,似乎更大的障碍是 Vector 从根本上说,消费者只能融合可以有效转化为图书馆的数据类型 Stream 类型。所以我认为你不能融合 Vector 消费者随心所欲 Foldables的原因类似于您无法实施的原因 uncons :: [a] -> Maybe (a, [a]) 公正有效 foldr。 (试着写 toVector 就......而言 Foldable.foldr 和 Stream.unfoldr,没有有效地重新实现 Foldable.toList - 我不认为可以做到......)所以你的解决方案可能是最佳的。 - Luis Casillas


答案:


所有 Traversable 实例也是 Foldable,所以你可以写类似的东西

toVector :: Foldable t => t a -> Vector a
toVector = Vector.fromList . Foldable.toList
{-# INLINE toVector #-}

这可能会成为一个中间列表,如果这不会被融合掉。内联应该有助于使融合更有可能。


11
2018-04-25 01:27



我只是一个镜头,似乎更大的障碍是 Vector 从根本上说,消费者只能融合可以有效转化为图书馆的数据类型 Stream 类型。所以我认为你不能融合 Vector 消费者随心所欲 Foldables的原因类似于您无法实施的原因 uncons :: [a] -> Maybe (a, [a]) 公正有效 foldr。 (试着写 toVector 就......而言 Foldable.foldr 和 Stream.unfoldr,没有有效地重新实现 Foldable.toList - 我不认为可以做到......)所以你的解决方案可能是最佳的。 - Luis Casillas