Лучший подход зависит от формата двоичного файла.
Многие двоичные форматы разработаны для упрощения анализа (в отличие от текстовых форматов, которые в первую очередь должны читаться людьми). Таким образом, любому типу данных объединения будет предшествовать дискриминатор, который сообщает вам, какой тип следует ожидать, все поля имеют либо фиксированную длину, либо предшествуют полю длины, и так далее. Для такого рода данных я бы порекомендовал Data.Binary; обычно вы создаете соответствующий тип данных Haskell для каждого типа в файле, а затем делаете каждый из этих типов экземпляром Binary. Определите метод «get» для чтения; он возвращает монадное действие «Get», которое по сути является очень простым синтаксическим анализатором. Вам также необходимо определить метод "put".
С другой стороны, если ваши двоичные данные не вписываются в этот мир, вам потребуется attoparsec. Я никогда не использовал это, поэтому я не могу комментировать дальше, но это сообщение в блоге очень позитивно.