Перебирать список в haskell? - PullRequest
       16

Перебирать список в haskell?

1 голос
/ 11 февраля 2010

Я пишу аудиопрограмму на Хаскеле, используя Portaudio. У меня есть функция, которая генерирует список сэмплов, которые я хотел бы воспроизвести, и я пытаюсь воспроизвести их, используя следующий фрагмент внутри main:

curSamps <- return (chunk 1 (sineWave 440 44100))
forever $ do
  Right numSampsAvail <- getStreamWriteAvailable paStream
  Right NoError <- writeStream paStream curSamps numSampsAvail
  curSamps <- return (drop numSampsAvail curSamps)

sineWave - это функция, которую я создал, чтобы генерировать бесконечный список выборок Int16 синусоиды с заданной частотой и частотой дискретизации.

Когда я отлаживаю этот код, заменяя код вывода звука на putStrLn, он печатает все 0, что является первым примером из функции.

Как я могу перебрать этот список с помощью функций вывода звука? Я не думаю, что смогу использовать рекурсию или карту.

Редактировать: Ошибка копирования кода

Ответы [ 3 ]

4 голосов
/ 11 февраля 2010

Использовать рекурсию:

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))
          ...
4 голосов
/ 11 февраля 2010

Рассмотрите возможность использования монадических кузенов map mapM / forM.

2 голосов
/ 11 февраля 2010

Используя те же функции API, можно сделать это:

let playSamples curSamps = do
      Right numSampsAvail <- getStreamWriteAvailable paStream
      Right NoError <- writeStream paStream curSamps numSampsAvail
      playSamples (drop numSampsAvail curSamps)
playSamples (chunk 1 (sineWave 440 44100))

Я не знаком с API Portaudio, поэтому он может предоставить более удобный, высокоуровневый способ выполнения того, чего вы пытаетесь достичь.

...