Рассматривая, как наилучшим образом отобразить карту, то есть traverse
, a -> Maybe a
-Kleisli над unboxed vector, я искал существующую реализацию. Очевидно U.Vector
не Traversable
, но it does supply a mapM
, который для Maybe
, конечно, работает просто отлично.Почему невозможно использовать апликативно-поперечные массивы? (Или это?)
Но вопрос в том, что ограничение Monad
действительно необходимо? Ну, получается, что даже boxed vectors cheat for the Traversable
instance: они на самом деле просто пересекать список, что они конвертировать из/в:
instance Traversable.Traversable Vector where
{-# INLINE traverse #-}
traverse f xs = Data.Vector.fromList Applicative.<$> Traversable.traverse f (toList xs)
mono-traversable
does the same thing also for unboxed vectors; здесь это кажется еще более ужасным по производительности.
Теперь я не удивлюсь, если бы vector
действительно мог сплавить многие из этих взломанных обходов в гораздо более эффективную форму, но все же - кажется, есть фундаментальная проблема, мешающая нам осуществить обход на массив сразу. Есть ли «глубокая причина» для этой неспособности?
Отсутствие экземпляра для 'U.Vector' связано с ограничением' Unbox' для элементов. См. [* Почему массивы unboxed не являются экземплярами складных? *) (Http://stackoverflow.com/q/36322904/2751851) (ответ Соняна также содержит некоторые важные комментарии о * mono-traversable *). – duplode
Конечно, но это не то, о чем я прошу. Мне не нужен фактический экземпляр «Traversable», мне просто нужен эффективный обход! И «mono-traversable» не предлагает этого. – leftaroundabout
К сожалению, я не заметил «очевидно» в вашем первом абзаце :) – duplode