Functional programming literally means "programming with functions." Here we are talking about a mathematical function and not a subroutine . What's the difference?
( Ackermann):

(.. ). : . .
, :
function A(m, n) {
var stack = [], exit;
do {
if (m > 0) {
m = m - 1;
while (n > 0) {
stack.push(m);
n = n - 1;
}
n = 1;
} else {
m = stack.pop();
n = n + 1;
}
} while (m !== exit);
return n;
}
. , , m, n stack. , , , .
counter:
function counter(count) {
return function () {
return ++count;
};
}
var countup = counter(0);
alert(countup());
alert(countup());
alert(countup());
Hide result? , , . counter . , (.. ) .
: , - , JavaScript . , . .
, -. , counter, , -. , , counter. , . . - .
, , ?
. . ? , . .
, , , , Number, , . , , { count: Number } (.. count, Number), counter. , :
var counter = { count: 5 };
counter :: Counter "counter - counter".
:
function Counter(count) {
return { count: count };
}
var counter = Counter(5);
, counter ( Number -> Counter, "Number counter" ), counter ( { count: Number }). . , .
, :
function count(counter) {
return counter.count;
}
. , counter . , Number counter (.. n counter c counter, c n count ).
, counter Number . counter.
, counter increment. . . counter? , counter. . , :
function increment(counter) {
return Counter(count(counter) + 1);
}
, decrement:
function decrement(counter) {
return Counter(count(counter) - 1);
}
, Number counter, increment decrement c c + 1 c - 1 . , - .
, ?
, . , , . , , ?
function bicounter(count) {
return {
increment: update(+1),
decrement: update(-1)
};
function update(amount) {
return function () {
return count += amount;
};
}
}
var counter = bicounter(0);
alert(counter.increment());
alert(counter.decrement());
Hide result, , , State. Haskell , JavaScript:
import Control.Monad.State
type Counter = Int
counter :: Counter
counter = 0
increment = modify (+1)
decrement = modify (subtract 1)
alert = get >>= (liftIO . print)
program = do
increment
alert
decrement
alert
main = evalStateT program counter
Haskell. , ? . , Haskell.