Haskell 为什么MVector不可折叠?
我可以理解为什么Haskell 为什么MVector不可折叠?,haskell,Haskell,我可以理解为什么MVector类型(来自vector包)不引用Foldable类型类吗? 我想人们经常需要迭代向量。我可以冻结它到Data.Vector然后迭代。但是我讨厌转换这些东西,好像我们对String、Text、Bytestring等做得不够 在我的例子中,我想打印每个元素。读取可变向量需要在相关的monad--IO或sts中执行效果。但是可折叠要求你能够给出一个纯粹的答案;如果有一个实例,我们必须至少能够实现 foldr :: (a -> b -> b) -> b -
MVector
类型(来自vector
包)不引用Foldable
类型类吗?
我想人们经常需要迭代向量。我可以冻结
它到Data.Vector
然后迭代。但是我讨厌转换这些东西,好像我们对String
、Text
、Bytestring
等做得不够
在我的例子中,我想打印每个元素。读取可变向量需要在相关的monad--
IO
或sts
中执行效果。但是可折叠
要求你能够给出一个纯粹的答案;如果有一个实例,我们必须至少能够实现
foldr :: (a -> b -> b) -> b -> MVector s a -> b
即使调用者选择的
b
没有提到IO
或ST
。哎呀 MVector
本质上是对向量的引用,因此需要读取以获取向量中包含的数据。MVector
也不过是一个包含两个索引的包装器。@WillemVanOnsem我正试图在Haskell中实现快速排序。在这种情况下,MVector
是一个不错的选择吗?我分不清引用和实向量之间的区别。任何可变容器都不能像不可变容器一样进行迭代。原因与我们不能将IORef Int
当作Int
使用的原因相同。大致上,不可变数据可以在任何地方读取和使用,而无需指定读取的时间和其他副作用(因为它总是读取相同的值)。相反,可变数据只能在某些单子中读取(和写入),从而迫使人们对副作用进行排序。@chi是的,为什么MVector
不是可折叠的
?因为您无法从其monad之外的MVector
读取数据。为什么不能从monad之外的MVector
读取数据?