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