代码之家  ›  专栏  ›  技术社区  ›  Edward

迭代haskell中的列表?

  •  1
  • Edward  · 技术社区  · 16 年前

    我正在使用Portaudio在Haskell编写音频程序。我有一个函数,它生成了一个我想播放的示例列表,我尝试使用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)
    

    正弦波是我创建的一个函数,它以指定的频率和采样率生成一个无穷多的正弦波Int16样本列表。

    当我调试这个代码时,通过用putsrln替换音频输出代码,它将打印所有0,这是函数的第一个示例。

    如何使用音频输出函数迭代此列表?我认为我不能使用递归或映射。

    编辑:代码复制错误

    3 回复  |  直到 16 年前
        1
  •  4
  •   dave4420    16 年前

    使用递归:

    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))
              ...
    
        2
  •  4
  •   Dario    16 年前

    考虑使用 map 单亲表亲 mapM / forM .

        3
  •  2
  •   Reid Barton    16 年前

    使用相同的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,因此它可能提供一种更方便、更高级的方式来完成您想要实现的目标。