一边琢磨如何最好地映射,即traverse
,一个a -> Maybe a
-Kleisli在一个未装箱载体,我找了一个现有的实现.显然U.Vector
不是Traversable
,但它确实提供了一个mapM
,Maybe
当然工作得很好.
但问题是:Monad
真的需要约束吗?好吧,事实证明,甚至盒装向量为Traversable
实例作弊:它们实际上只是遍历一个列表,它们从/转换为:
instance Traversable.Traversable Vector where {-# INLINE traverse #-} traverse f xs = Data.Vector.fromList Applicative.<$> Traversable.traverse f (toList xs)
mono-traversable
对于未装箱的载体也会做同样的事情 ; 在这里,这似乎更加令人毛骨悚然.
现在,如果vector
实际上能够将这些被攻击的遍历融合成更有效的形式,我不会感到惊讶,但仍然 - 似乎存在一个根本问题,阻止我们立即在阵列上实现遍历.这种无能是否存在"深层原因"?