Questa è una domanda noob.Haskell: nascondere i guasti nell'IO pigro
mi piacerebbe scrivere una funzione che fornisce un flusso pigro di immagini, presumibilmente qualcosa di simile:
imageStream :: [IO Image]
Purtroppo, la funzione che legge le immagini possono fallire, così sembra:
readImage :: IO (Maybe Image)
Quindi, la funzione I posso scrittura assomiglia:
maybeImageStream :: [IO (Maybe Image)]
Come si implementa una funzione come la seguente, pur mantenendo l'IO pigro?
flattenImageStream :: [IO (Maybe Image)] -> [IO Image]
vista semantico, quando si chiede flattenImageStream
per l'immagine successiva, che dovrebbe scorrere la lista e tentare di leggere ogni immagine. Lo fa finché non trova un'immagine che carica e la restituisce.
EDIT: Sembra esserci un disaccordo nelle risposte. Alcuni hanno suggerito soluzioni che usano sequence
, ma sono abbastanza sicuro che l'ho provato e ho scoperto che distrugge la pigrizia. (Lo testerò di nuovo per essere sicuro quando torno al mio computer.) Qualcuno ha anche suggerito di usare unsafeInterleaveIO
. Dalla documentazione per quella funzione, sembra che avrebbe funzionato, ma ovviamente voglio rispettare il sistema di tipi il più possibile.
Sei sicuro di voler un '[Immagine IO]'? 'IO [Image]' non sarebbe più facile da lavorare? – jwodder
@jwodder, potrei sbagliarmi, ma penso che 'IO [Immagine]' implica che le immagini verranno caricate rigorosamente, mentre voglio caricarle pigramente a causa della memoria e di altre cose. – emchristiansen
Nah saranno ancora pigri. se restituisci [Immagine IO] non hai caricato nulla. Hai solo un elenco di funzioni io da eseguire per caricare le immagini. – DiegoNolan