Ответ Cirdec в основном не связанный с вопросом вопрос заставил меня задаться вопросом, как лучше представлять натуральные числа с добавлением по времени, вычитанием на единицу и тестированием на нуль.
Почему арифметика Peano недостаточно хороша:
Предположим, что мы используем
data Nat = Z | S Nat
Тогда мы можем написать
Z + n = n
S m + n = S(m+n)
Мы можем рассчитать m+n
в O (1) раз, поместив m-r
дебет (для некоторой константы r
), по одному на каждый конструктор S
, добавленный на n
. Чтобы получить O (1) isZero
, мы должны иметь не более p
дебетов для конструктора S
для некоторой константы p
. Это отлично работает, если мы вычислим a + (b + (c+...))
, но развалимся, если вычислить ((...+b)+c)+d
. Проблема заключается в том, что дебетовые счётчики складываются на передней панели.
Один вариант
Легкий выход - просто использовать катаные списки, такие как те, которые Окасаки описывает, напрямую. Есть две проблемы:
-
O (n) пространство на самом деле не идеально.
-
Не совсем ясно (по крайней мере для меня), что сложность загруженных очередей необходима, когда нам не нужно упорядочивать способ, которым мы будем использовать списки.