見習村30 - A Chain adding function

30 - A Chain adding function

Don’t say so much, just coding…

Instruction

We want to create a function that will add numbers together when called in succession.

1
2
add(1)(2);
// returns 3

We also want to be able to continue to add numbers to our chain.

1
2
3
add(1)(2)(3); // 6
add(1)(2)(3)(4); // 10
add(1)(2)(3)(4)(5); // 15

and so on.

A single call should return the number passed in.

1
add(1); // 1

We should be able to store the returned values and reuse them.

1
2
3
4
5
var addTwo = add(2);
addTwo; // 2
addTwo + 5; // 7
addTwo(3); // 5
addTwo(3)(5); // 10

We can assume any number being passed in will be valid whole number.

Ruby

Init

1
2
3
def add(n)
# ...
end

Sample Testing

1
2
3
Test.expect(add(1) == 1);
Test.expect(add(1).(2) == 3);
Test.expect(add(1).(2).(3) == 6);

Javascript

Init

1
2
3
function add(n){
// Let the currying begin!
}

Sample Testing

1
2
3
Test.expect(add(1) == 1);
Test.expect(add(1)(2) == 3);
Test.expect(add(1)(2)(3) == 6);

Thinking

https://ithelp.ithome.com.tw/upload/images/20201015/20120826uwpX2JABrn.jpg
圖片來源:Unsplash Martin Garrido

Hint & Reference

Solution

Ruby

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Solution 1
def add(n)
n
end

class Fixnum
def call(m)
self + m
end
end

# Solution 2
def add(n)
def call(m)
return self + m
end
return n
end

Javascript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Solution 1
function add(n){
var fn = function(x) {
return add(n + x);
};

fn.valueOf = function() {
return n;
};

return fn;
}

// Solution2
function add(n) {
const f = x => add(n + x)
f.valueOf = () => n
return f;
}