我正在尝试从标准输入读取数据作为双精度,操作它们并写入它们。到目前为止,我想出的是:
import qualified Data.ByteString.Lazy as B
import Data.Binary.IEEE754
import Data.Binary.Get
-- gives a list of doubles read from stdin
listOfFloat64le = do
empty <- isEmpty
if empty
then return []
else do v <- getFloat64le
rest <- listOfFloat64le
return (v : rest)
-- delay signal by one
delay us = 0 : us
-- feedback system, add delayed version of signal to signal
sys us = zipWith (+) us (delay us)
main = do
input <- B.getContents
let hs = sys $ runGet listOfFloat64le input
print $ take 10 hs
这个想法是将数据馈送到程序中,然后在将其写入标准输出之前通过反馈系统。虽然现在它只打印前 10 个值。
这有效,但似乎并没有懒惰地评估。即它必须将所有输入读入内存。所以:
dd if=/dev/urandom bs=8 count=10 | runhaskell feedback.hs
会很好,但是:
dd if=/dev/urandom | runhaskell feedback.hs
将不会。我的猜测是它listOfFloat64le
使事情无法正常工作的功能。那么如何创建一个可迭代的对象来传递给我的sys
函数,而不必将所有内容都读入内存呢?
我不是一个很有经验的haskeller。