Ответ 1
После прочтения соответствующего источника vector
и попытки сделать mapM
работать с Applicative
, я думаю, причина, по которой Data.Vector.Unboxed.Vector
не имеет функции traverse :: (Applicative f, Unbox a, Unbox b) -> (a -> f b) -> Vector a -> f (Vector b)
и Data.Vector.Vector
, не имеет нативный traverse
- это код слияния. Нарушителем является следующий тип Stream
:
-- Data/Vector/Fusion/Stream/Monadic.hs Line: 137
-- | Result of taking a single step in a stream
data Step s a where
Yield :: a -> s -> Step s a
Skip :: s -> Step s a
Done :: Step s a
-- | Monadic streams
data Stream m a = forall s. Stream (s -> m (Step s a)) s
Это используется внутренне для реализации mapM
. m
будет таким же, как от вашего первоначального вызова до Data.Vector.Unboxed.mapM
. Но поскольку позвоночник этого потока находится внутри функтора m
, с ним невозможно работать, если у вас есть только аппликация для m
.
См. также эту проблему в реестре vector
GitHub: Ослабление ограничения на mapM.
Отказ от ответственности: я не знаю, как работает фьюжн. Я не знаю, как работает vector
.