Implement mapM for sequences
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 25/100
Direzione di ricerca
Non è indicato alcun percorso di file o di test. Inizia individuando l’istanza Traversable e i costruttori Node2 e Deep mostrati nell’issue, quindi confronta il loro comportamento predefinito di mapM con la costruzione strict proposta. L’attività è completata quando esiste un’implementazione ottimizzata per le forme di sequenza rilevanti e il suo comportamento è coperto dai test esistenti del progetto.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
The Traversable class includes a method
class Traversable t where
...
mapM :: Monad m => (a -> m b) -> t a -> m (t b)
This is normally allowed to take its default definition of mapM = traverse. However, I think it typically makes more sense to use this method as an opportunity to optimize for common, non-Identity, "strict" monads, such as IO and strict StateT. What does this mean in practice? Instead of building up an enormous pile of closures that will eventually be evaluated to produce the result sequence, we can build the result as we go. It could look something like this:
mapM f (Node2 n (Elem a) (Elem b)) = liftA2 (\a' b' -> Node2 n (Elem a') (Elem b')) (f a) (f b)
mapM f (Node2 n (a :: Node _) b) = do
!a' <- f a
!b' <- f b
pure (Node2 n a' b')
-- Similar for top-level and other Digits
mapM f (Deep n pr m sf) = do
!pr' <- mapM f pr
!m' <- mapM (mapM f) m
!sf' <- mapM f sf
pure (Deep n pr' m' sf')
The idea is that we build each node as soon as its children are available, rather than risking waiting until all actions are performed to construct anything.
- Lingua principale
- Haskell
- Stelle
- 355
- Fork
- 194
- Merge medio
- 3g 4h
- PR unite (30g)
- 7
Preparare l'ambiente
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di haskell/containers
-
unfoldTree is too lazyApertamajor-release strictness Tree
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
haskell/containers#1260 ·
I maintainer di solito rispondono entro 1 giorno
-
IntSet low-hanging-fruit performance
Difficoltà 3/5 1-2 giorni Idoneità per principianti 58/100
haskell/containers#1251 ·
I maintainer di solito rispondono entro 1 giorno
-
maintainability major-release
Difficoltà 3/5 1-2 giorni Idoneità per principianti 70/100
haskell/containers#1250 ·
I maintainer di solito rispondono entro 1 giorno
-
PostOrder: foldl and foldr'Apertaperformance Tree
Difficoltà 3/5 1-2 giorni Idoneità per principianti 55/100
haskell/containers#1247 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 50/100
haskell/containers#1242 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di haskell/containers
Issue simili
-
infrastructure
Difficoltà 1/5 1-3 ore Idoneità per principianti 65/100
alunduil/siren-json.hs#232 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
jgm/asciidoc-hs#14 ·
-
brick-3.0Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
commercialhaskell/stackage#8129 · 2 commenti ·
-
Add DataHaskell ?Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 76/100
severo/awesome-parquet#50 ·