0%

Partial application & Currying

Partion Application

顧名思義,提供函數一部分的參數。變成一個新的函數。
最簡單的例子就像這樣

1
2
3
4
5
6
7
8
int sub(int a, int b)
{
return a - b;
}
int sub2(int v)
{
return sub(v, 2);
}

當然上面這種寫法復用度並不高,於是在C++11把bind跟function納入標準配備之後,可以寫成這樣。

1
std::function<int(int)> sub2 = std::bind(sub, std::placeholders::_1, 2);

有時間再來討論bind跟function。
不過就可讀性來說,Pyhton版的強多了

1
2
3
4
5
import functools
def sub(a, b):
return a - b

sub_two = functools.partial(sub, b = 2)

Currying

Currying是為了解決不一樣的問題
假設一個函數有多個參數,把他轉化成多個只有一個參數的函數組合。
用C++11的Lambda Expression來做示範。

1
2
3
4
5
6
7
std::function<int(int)> add2(int a)
{
return std::function<int(int)>([=](int b) -> int{
return a + b;
});
}
cout << add2(3)(5) << endl;

基本上PCurrying可以實現一部分Partion Application的應用。不過以上麵的sub2為例,Currying在這邊就不是用。
更清楚的描述可以看What is the difference between currying and partial application