Рассматривая, как наилучшим образом отображать карту, т.е. traverse
, a -> Maybe a
-Kleisli над unboxed vector, я искал существующую реализацию. Очевидно, 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
действительно смог сплавить многие из этих взломанных обходов в гораздо более эффективную форму, но все же - кажется, есть фундаментальная проблема, мешающая нам реализовать обход на массив сразу. Есть ли какая-то "глубокая причина" для этой неспособности?