Haskell 是否存在具有非固定向量性能的无限列表?

Haskell 是否存在具有非固定向量性能的无限列表?,haskell,signal-processing,lazy-evaluation,Haskell,Signal Processing,Lazy Evaluation,我是专门考虑信号处理的。假设我想做一些事情,比如将输入信号的幅度增加一倍。我希望它非常快,因此我希望信号保存在连续内存中(例如,未固定向量)。但是这个信号可以无限期地持续下去,所以我希望它被视为一个无限列表;我宁愿调用map(*2)signal一次,而不是为每个信号块调用它 Haskell中是否有一个数据结构可以缓冲这些数据块,这样我就可以获得连续的内存性能,但可以将数据视为无限流?这只是一个很长的目标,但是使用足够大的未固定向量块又如何呢?这将具有向量性能的优势,同时也得益于流 更新:这个想法

我是专门考虑信号处理的。假设我想做一些事情,比如将输入信号的幅度增加一倍。我希望它非常快,因此我希望信号保存在连续内存中(例如,未固定向量)。但是这个信号可以无限期地持续下去,所以我希望它被视为一个无限列表;我宁愿调用
map(*2)signal
一次,而不是为每个信号块调用它


Haskell中是否有一个数据结构可以缓冲这些数据块,这样我就可以获得连续的内存性能,但可以将数据视为无限流?

这只是一个很长的目标,但是使用足够大的未固定向量块又如何呢?这将具有向量性能的优势,同时也得益于流

更新:这个想法是定义一个
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

. (我认为是的,至少你可以建立一些俗气的例子,但我没有做太多认真的工作。)一个分块的无限列表,但没有所有的时间记账本身将是一个有趣的项目。懒惰的ByTestring可以做到这一点,除非它们只能容纳字节。在内部,lazy bytestring是一个未绑定数组的列表。我不知道还有其他数据类型的类似库。Lazy ByTestring似乎正是我想要的。它似乎试图做同样的事情,但使用任意元素。这解决了性能问题,但我不能将块流视为一个长列表(或向量),对吗?如果我想应用一个需要元素向量的函数,我就必须使用map.map,而不是调用map,对吗?@DurnWhippersnapper你是对的,但是它可以隐藏在
newtype
数据类型和一组相应的函数中,因此内部实现对其他模块来说是完全不透明的。我更新了答案。只需将其设置为一个函子。@PyRulez函子可能不可能,因为出于性能原因,数据类型很可能不会是多态的。但是,也可以使用,因为它也支持单态类型。多态性有什么关系?