gpt4 book ai didi

haskell - 惰性二进制获取

转载 作者:行者123 更新时间:2023-12-02 12:30:07 25 4
gpt4 key购买 nike

为什么是Data.Binary.Get是不是像它说的那么懒?或者我在这里做错了什么?

import Data.ByteString.Lazy (pack)
import Data.Binary.Get (runGet, isEmpty, getWord8)

getWords = do
empty <- isEmpty
if empty
then return []
else do
w <- getWord8
ws <- getWords
return $ w:ws

main = print $ take 10 $ runGet getWords $ pack $ repeat 1

这个主函数只是挂起而不是打印 10 个单词。

最佳答案

您链接的文档提供了几个示例。第一个需要读取所有输入才能返回,并且看起来很像您编写的内容。第二个是左折叠,以流方式处理输入。这是用这种风格重写的代码:

module Main where

import Data.Word (Word8)
import qualified Data.ByteString.Lazy as BL
import Data.Binary.Get (runGetState, getWord8)

getWords :: BL.ByteString -> [Word8]
getWords input
| BL.null input = []
| otherwise =
let (w, rest, _) = runGetState getWord8 input 0
in w : getWords rest

main :: IO ()
main = print . take 10 . getWords . BL.pack . repeat $ 1

测试:

*Main> :main
[1,1,1,1,1,1,1,1,1,1]

关于haskell - 惰性二进制获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16119184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com