Haskell: монады и оператор (:) - PullRequest
0 голосов
/ 26 марта 2011

У меня есть следующее:

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? Не могу не чувствовать, что могу получить какую-то хвостовую рекурсию или что-то в этом роде.

1 Ответ

4 голосов
/ 26 марта 2011

Короче:

liftM2 (:) parseExtension (parseExtensions size)

Лучше, я не уверен: - \

...