データを標準入力からダブルスとして読み取り、操作して、同様に書き込もうとしています。これまでに思いついたのは次のとおりです。
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
アイデアは、データをプログラムにフィードし、それをフィードバック システムに渡してから stdout に書き込むことです。ただし、今は最初の 10 個の値を出力するだけです。
これは機能しますが、遅延評価しているようには見えません。つまり、すべての入力をメモリに読み込む必要があります。そう:
dd if=/dev/urandom bs=8 count=10 | runhaskell feedback.hs
うまくいきますが:
dd if=/dev/urandom | runhaskell feedback.hs
しない。私の推測では、listOfFloat64le
物事が適切に機能しないのは機能です。sys
では、すべてをメモリに読み込まずに関数に渡す iterable を作成するにはどうすればよいでしょうか?
私はあまり経験豊富な Haskeller ではありません。