Haskellでリストを反復処理しますか?
-
20-09-2019 - |
質問
私はPortaudioを使ってHaskellでオーディオプログラムを書いています。私はプレーしたいサンプルのリストを生成する機能を持っている、と私は、メインの内側に次のコードを使用してそれらを再生しようとしています:
curSamps <- return (chunk 1 (sineWave 440 44100))
forever $ do
Right numSampsAvail <- getStreamWriteAvailable paStream
Right NoError <- writeStream paStream curSamps numSampsAvail
curSamps <- return (drop numSampsAvail curSamps)
正弦波は、私は、特定の周波数とサンプル・レートで正弦波のInt16型サンプルの無限のリストを生成するために作成した機能です。
私はこのコードをデバッグする場合、、putStrLnと音声出力コードを置き換えることによって、それは関数の最初のサンプルである、すべての0を出力します。
どのようにして、音声出力機能を備えたこのリストを反復処理することができますか?私は、再帰やマップを使用することができないと思います。
編集:コードのコピーミス
解決
使用再帰ます:
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))
...
他のヒント
map
のモナドのいとこの使用を検討して mapM
/ forM
でます。
1はこれを行うことができ、同じ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))
私はPortaudioのAPIに精通していないよ、それはあなたが達成しようとしている何をして、より便利に、より高いレベルの方法を提供することがあります。
所属していません StackOverflow