39 lines
810 B
JavaScript
39 lines
810 B
JavaScript
(() => {
|
|
'use strict';
|
|
|
|
// ackermann :: Int -> Int -> Int
|
|
const ackermann = m => n => {
|
|
const go = (m, n) =>
|
|
0 === m ? (
|
|
succ(n)
|
|
) : go(pred(m), 0 === n ? (
|
|
1
|
|
) : go(m, pred(n)));
|
|
return go(m, n);
|
|
};
|
|
|
|
// TEST -----------------------------------------------
|
|
const main = () => console.log(JSON.stringify(
|
|
[0, 1, 2, 3].map(
|
|
flip(ackermann)(3)
|
|
)
|
|
));
|
|
|
|
|
|
// GENERAL FUNCTIONS ----------------------------------
|
|
|
|
// flip :: (a -> b -> c) -> b -> a -> c
|
|
const flip = f =>
|
|
x => y => f(y)(x);
|
|
|
|
// pred :: Enum a => a -> a
|
|
const pred = x => x - 1;
|
|
|
|
// succ :: Enum a => a -> a
|
|
const succ = x => 1 + x;
|
|
|
|
|
|
// MAIN ---
|
|
return main();
|
|
})();
|