我专门考虑信号处理。让我们说我想做一些像输入信号幅度加倍的事情。我希望它非常快,所以我希望信号保持在连续的存储器中(例如,未装箱的矢量)。但是这个信号可以无限期地继续下去,所以我希望它被视为一个无限的列表;我宁愿拨打map (*2) signal
一次而不是为每个信号块调用它。
Haskell中是否有一个数据结构可以缓冲这些数据块,以便我可以获得连续的内存性能,但是将数据视为无限流?
答案 0 :(得分:6)
这只是一个很长的镜头,但是使用足够大的未装箱的向量的streams呢?这将具有向量性能的优势,同时,fusion归功于流。
更新:我们的想法是定义newtype
,例如:
import Data.Array.Unboxed
import Data.Stream
import Data.Word
newtype Word8Stream = Word8Stream (Stream (UArray Int Word8))
然后定义所需的通用函数,例如
smap :: (Word8 -> Word8) -> Word8Stream -> Word8Stream
smap f (Word8Stream s) = Word8Stream $ fmap (amap f) s