Iterare lista in Haskell?
-
20-09-2019 - |
Domanda
Sto scrivendo un programma audio in Haskell utilizzando PortAudio. Ho una funzione che genera un elenco di campioni che mi piacerebbe giocare, e sto cercando di giocare utilizzando il seguente frammento all'interno principale:
curSamps <- return (chunk 1 (sineWave 440 44100))
forever $ do
Right numSampsAvail <- getStreamWriteAvailable paStream
Right NoError <- writeStream paStream curSamps numSampsAvail
curSamps <- return (drop numSampsAvail curSamps)
sinusoide è una funzione che ho creato per generare un elenco infinito di campioni Int16 di una sinusoide ad un tasso di frequenza e il campione specificato.
Quando il debug di questo codice, sostituendo il codice di uscita audio con un putStrLn, stampa tutti 0, che è il primo campione dalla funzione.
Come posso iterare questo elenco con le funzioni di uscita audio? Io non penso di poter utilizzare la ricorsione o di una mappa.
Modifica: Codice di copia errore
Soluzione
Usa ricorsione:
play [] = return ()
play curSamps = do Right numSampsAvail <- getStreamWriteAvailable paStream
Right NoError <- writeStream paStream curSamps numSamps
play (drop numSampsAvail curSamps)
main = do ...
play (chunk 1 (sineWave 440 44100))
...
Altri suggerimenti
Si consiglia di utilizzare i cugini monadici di map
mapM
/ forM
.
Utilizzando le stesse funzioni API si può fare questo:
let playSamples curSamps = do
Right numSampsAvail <- getStreamWriteAvailable paStream
Right NoError <- writeStream paStream curSamps numSampsAvail
playSamples (drop numSampsAvail curSamps)
playSamples (chunk 1 (sineWave 440 44100))
Non ho dimestichezza con le API PortAudio, quindi potrebbe fornire una più conveniente, modo di livello più elevato di fare quello che stai cercando di raggiungere.