これは、私が以前に尋ねた質問のフォローアップです。のすべての呼び出しでIORef
、受け入れられたソリューションで以下のリストが更新される方法がそうであるかどうか疑問に思っています。おそらく、リストの先頭へのポインターを保持している可能性が高いためだと思います(毎回O(n)になるリスト全体をトラバースしてコピーするのではなく)新しいヘッドへのポインターを変更するだけで、O(1)になるはずです。リスト全体の熱心な評価を防ぎます)。ただし、その低レベルのコードは表示されません。だから、ここで尋ねる:O(1)
fetch
IORef
ghc-core
mklstream :: L.ByteString -> (IO S.ByteString -> IO r) -> IO r
mklstream lbs sink = do
ref <- newIORef (L.toChunks lbs)
let fetch :: IO S.ByteString
fetch = do chunks <- readIORef ref
case chunks of
[] -> return S.empty
(c:cs) -> do writeIORef ref cs
return c
sink fetch