2015-04-25 13 views

risposta

11

Tutti Traversable casi sono anche Foldable, in modo da poter scrivere qualcosa di simile

toVector :: Foldable t => t a -> Vector a 
toVector = Vector.fromList . Foldable.toList 
{-# INLINE toVector #-} 

Questo potrebbe fare una lista intermedia, però, se questo non viene fusa via. L'inlining dovrebbe aiutare a rendere più probabile la fusione.

+0

Ho appena avuto un tentativo e sembra che l'ostacolo più grande è che i consumatori di 'Vector', fondamentalmente, possono fondersi solo con tipi di dati che possono essere trasformati in modo efficiente nel tipo' Stream' della libreria. Quindi non penso che tu possa fondere i consumatori di 'Vector' con un' Foldable's arbitrario per ragioni simili al motivo per cui non puoi implementare 'uncons :: [a] -> Maybe (a, [a])' ​​efficientemente con solo 'foldr'. (Prova a scrivere 'toVector' in termini di' Foldable.foldr' e 'Stream.unfoldr', senza reimplementare in modo efficace' Foldable.toList'-Non penso che possa essere fatto ...) Quindi la tua soluzione potrebbe essere ottimale . –