А если цикл?
Определяем числа:
Zero = s => z => z
One = s => z => s (z)
Two = s => z => s (s (z))
Операции над ними:
IsZero = n => n (_ => False) (True)
Lte = n => m => IsZero (Sub (n) (m))
Lt = n => m => Lte (Succ (n)) (m)
Фолд:
const Foldr = f => z => l => l (f) (z)
Операции над списками:
const Append = a => l => (f => x => f (a) (l (f) (x)))
const Head = l => l (a => _ => a) ()
const list = Append (1) (Append (2) (Nil))
const Map = m => l => (f => x => l (a => f (m (a))) (x))
const Length = l => Foldr (_ => Succ) (Zero) (l)
Определяем комбинатор неподвижной точки
Z = f => (x => f (y => x (x) (y)))
(x => f (y => x (x) (y)))
Теперь можем определить поиск остатка от деления
Rem = Z (rem => n => m => (
If (Lt (n) (m)) (_ => n)
(_ => rem (Sub (n) (m)) (m))
) ())
console.assert(1 == toInt (Rem (Three) (Two)))