Есть ли эффективный способ преобразования унарного числа в двоичное число?
Пусть эти типы данных представляют одинарные и двоичные натуральные числа, соответственно:
data UNat = Succ UNat | Zero
data BNat = One BNat | Zero BNat | End
u0 = Zero
u1 = Succ Zero
u2 = Succ (Succ Zero)
u3 = Succ (Succ (Succ Zero))
u4 = Succ (Succ (Succ (Succ Zero)))
b0 = End // 0
b1 = One End // 1
b2 = One (Zero End) // 10
b3 = One (One End) // 11
b4 = One (Zero (Zero End)) // 100
(Alternatively, one could use `Zero End` as b1, `One End` as b2, `Zero (Zero End)` as b3...)
Мой вопрос: есть ли способ реализовать функцию:
toBNat :: UNat -> BNat
Это работает вO(N)
Делаете только один проход через УНат?