【发布时间】:2016-06-16 00:07:15
【问题描述】:
我有一些类似下面的代码,它根据从磁盘读取的随机 samples 更新 state:
myloop 0 state = return state
myloop n state = do
sample <- getRandomSampleFromFile
myloop (n - 1) (process state sample)
如何以惯用的方式使用高阶函数来避免显式函数和递归(最好不要引入庞大的库)?
澄清:我不能只做replicateM n getRandomSampleFromFile,因为我需要处理大量样本,并且首先将所有样本读入内存是不可行的。
【问题讨论】:
-
我不确定 replicateM 是否必须读取内存中的所有样本。我可能错了。
-
@mb14 当然会!!
replicateM像sequence、traverse和mapM仅在您将列表视为数组时才有意义。您也可以使用来自例如的真实数组类型。vector一看到这些词,就想“也许是一个流媒体库?”。在长列表中,它们将总是 累积列表并导致空间泄漏。这就是我们拥有流媒体库的原因。 (例如,可以将replicateM& company 专门用于 IO,然后使用惰性 io 之类的东西,请参阅 twanvl.nl/blog/haskell/unsafe-sequence)
标签: haskell higher-order-functions