Podczas rozważania, jak najlepiej odwzorować, tj. traverse
, a -> Maybe a
-Kleisli nad unboxed vector, szukałem istniejącej implementacji. Oczywiście U.Vector
nie jest Traversable
, ale it does supply a mapM
, który dla Maybe
oczywiście działa dobrze.Dlaczego nie jest możliwe stosowanie tablic próbnych? (Czy tak?)
Ale pytanie brzmi: czy ograniczenie jest naprawdę potrzebne? Cóż, okazuje się, że nawet boxed vectors cheat for the Traversable
instance: oni naprawdę tylko przechodzić do listy, które konwersji do/z:
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; tutaj wydaje się to jeszcze bardziej makabryczne.
Teraz nie byłbym zaskoczony, gdyby vector
był w stanie połączyć wiele z tych zhakowanych przejść w znacznie bardziej wydajną formę, ale nadal - wydaje się, że istnieje podstawowy problem, uniemożliwiający nam wykonanie przejścia na tablica od razu. Czy istnieje jakaś "głęboka przyczyna" dla tej niezdolności?
Brak instancji dla 'U.Vector' ma związek z ograniczeniem" Unbox "dla elementów. Zobacz [* Dlaczego tablice unboxed nie są instancjami składanymi? *] (Http://stackoverflow.com/q/36322904/2751851) (odpowiedź, autorstwa Snoymana, zawiera również kilka ważnych komentarzy na temat * mono-traversable *). – duplode
Jasne, ale nie o to pytam. Nie potrzebuję rzeczywistej instancji 'Traversable', potrzebuję tylko wydajnego przejścia! I "mono-traversable" nie oferuje tego. – leftaroundabout
Ups - nie zauważyłem "oczywiście" w twoim pierwszym akapicie :) – duplode