2014-12-03 16 views
5

Sono interessato alla creazione di un nuovo tipo di contenitore Haskell (elenchi rigorosi) e desidero assicurarmi che le operazioni su di essi siano idonee per la fusione del flusso. Come faccio a opt-in per la funzionalità di streaming stream di ghc?Come creare i contenitori Haskell che si fondono?

Se il mio contenitore è Traversable, si fonderà automaticamente? Se ho implementato, per esempio, mapAccumL in termini di toList, Haskell sarà abbastanza intelligente da non convertire affatto il contenitore in un Elenco, invece semplicemente operando sulla rappresentazione sottostante?

+3

Se si desidera una comprensione approfondita, guardare oltre il [carta di fusione flusso] (http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.104.7401). – luqui

+0

ghc non implementa la fusione del flusso. Implementa la fusione foldr/build. La differenza principale è che i concat sono fusibili solo attraverso la fusione foldr/build (sebbene la ricerca sia in corso), mentre le cerniere sono fusibili solo tramite fusione destroy/unfoldr (a cui la fusione del flusso è strettamente correlata). –

risposta

9

GHC non è in realtà affatto intelligente. È solo un (buon) software. Se si desidera che il nuovo cosa di fondere, di avere un paio di opzioni:

  1. costruirlo in cima a qualcosa che fonde già: Liste fusibile di fusione utilizzando foldr/build e vettori fusibile di fusione mediante flusso. Se crei il tuo tipo sopra uno di questi, è probabile che lo si possa fondere correttamente senza troppi problemi. Se hai l'opzione, questa è quasi sicuramente la scelta migliore.

  2. Fusibile solo alle interfacce: anche se il tuo tipo non si fonde, potresti voler organizzare una certa quantità di fusione quando viene convertita in o da un elenco o vettore.

  3. Scrivi fusione governa te stesso: questo non è troppo difficile in linea di principio, ma in pratica si sarà essere martellante la testa contro il muro, quindi a meno che sei pazzo come me, si consiglia di evitare questo approccio: le tue regole non spareranno quando vorrai, interferiranno in modi complicati con altre regole, l'inliner ti renderà il suo &% $ # @, e anche quando le cose sembrano funzionare bene, i benchmark mostreranno il contrario di ciò che volere.

Problemi correlati