RosettaCodeData/Task/Ackermann-function/JavaScript/ackermann-function-5.js

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();
})();