使用 PHP 實現函數柯里化

做法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function calc($x) {
return function($y) use ($x) {
// 如果閉包參數不可呼叫,將值存入陣列
if (! is_callable($y)) {
$args = (array) $x;
$args[] = $y;
return calc($args);
}

// 如果閉包參數可以呼叫,執行閉包函式
return $y(...$x);
};
}

// 元素相加
$sum = function(...$args) {
return array_sum($args);
};

// 元素相乘
$product = function(...$args) {
return array_product($args);
};

echo calc(2)(3)(4)(5)($sum) . '<br>';
// 14
echo calc(2)(3)(4)(5)($product) . '<br>';
// 120
echo calc(2)(3)('pow') . '<br>';
// 8
echo calc(100)(10)('log') . '<br>';
// 2
echo calc(20)(200)('rand') . '<br>';
// 104
echo calc(80)(40)('max') . '<br>';
// 80
echo calc(40)(80)('min') . '<br>';
// 40