Haskell:Monads和(:)运算符

时间:2011-03-26 17:12:44

标签: haskell monads

我有以下内容:

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

这个想法非常简单。我正在使用Data.Binary.Get从文件中读取数据。只要我仍然有数据可用(大小 - br> 20),解析它并重复。

是否有更简单/更短/更好的方法在parseExtensions函数中编写“then”?不禁觉得我可以得到某种尾递归或其他东西。

1 个答案:

答案 0 :(得分:4)

更短的:

liftM2 (:) parseExtension (parseExtensions size)

更好,我不确定: - \