简体   繁体   English

Haskell:Monads和(:)运算符

[英]Haskell: Monads and the (:) operator

I have the following: 我有以下几点:

parseExtensions :: GHC.Int.Int64 -> Get [Word32]
parseExtensions size = do
    br <- bytesRead
    if (size - br > 20) 
        then do
            ext  <- parseExtension
            exts <- parseExtensions size
            return $ ext : exts
        else return []

parseExtension :: Get Word32
parseExtension = do
    name <- getWord32be
    size <- getWord32be
    info <- getBytes (fromIntegral size)
    return name

The idea is pretty simple. 这个想法很简单。 I'm using Data.Binary.Get to read data off a file. 我正在使用Data.Binary.Get从文件中读取数据。 As long as I still have data available (size - br > 20), parse it and repeat. 只要我还有可用数据(大小-br> 20),就对其进行解析并重复。

Is there a simpler/shorter/better way to write the "then" in the parseExtensions function? 在parseExtensions函数中是否有更简单/更简短/更好的方式来编写“ then”? Can't help but feel I can get some sort of tail recursion or something going. 不禁觉得我可以进行某种形式的尾递归。

Shorter: 短:

liftM2 (:) parseExtension (parseExtensions size)

Better, I'm not sure :-\\ 更好,我不确定:-\\

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM