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
读取数据?