>И добавлять что-то в конец списка - плоха идея. Это O(n) операция. Лучше в конце использовать reverse
Не спорю, я потому и написал, что вариант некрасивый. К тому же для последующих операций в большинстве случаев логичнее иметь младшие биты в начале списка.
Есть ещё такой момент, что сдвиг требует инстанс Bits, а с делением - Integral. Может оказаться важным
Согласен, но по умолчанию (если в задаче явно не требуется работа с огромными числами) лучше использовать машинно-представимые типы, а они имеют инстанс Bits.
> Или менее красивый вариант, возвращающий всё в правильном порядке:
toBitList x | x == 0 = [] | otherwise = (toBitList (x `shiftR` 1)) ++ [x & 1]
Чего же правильного в этом порядке? Из определения списка и небольших раздумий над основными действиями с битовыми списками легко делается вывод, что little-endian — более правильный порядок. Как реализовывать сложение, например?