2011-06-02 57 views
2

我有一個函數f: (a, b, c = 5, d = 0) -> {...},它需要2到4個參數。是否有這個部分應用程序的名稱 - 就像函數式編程技術一樣?

我想通過這個函數總是使用最後一個參數的默認值的「綁定」的版本,但使用特定值(比如1和2)前兩個參數。那就是,我想要g:() -> f(1, 2)

如果我做的部分應用程序,我會得到g': (c = 5, d = 0) -> f(1, 2, c, d)。也就是說,部分申請不會強制執行我期望的g的零參數性質,而是給我g',這個參數需要0到2個參數。

什麼是正從fg叫,如果有什麼技術?

+1

'f'已經有了默認參數,所以爲什麼不對'g:() - > f(1,2)'進行修飾? – 2011-06-02 16:28:46

+2

我不明白這個問題如何與咖喱相關。你所描述的問題似乎並沒有涉及使一個函數接受一個參數並返回另一個函數,這就是currying的含義。 – murgatroid99 2011-06-02 16:39:20

+0

正如@ murgatroid99指出的那樣,這與currying無關...我認爲你的意思是「部分應用」,這是很多人與currying混淆的東西。我知道你所描述的技術沒有特別的名字。 – 2011-06-02 16:52:26

回答

2

張貼作爲一個答案我的評論:看來,這個問題有一點做與函數式編程或鑽營或部分應用程序,但不是精確的關於採取一個函數,它有缺省值的可選參數,並作出新功能沒有可選參數,其中默認參數已被修復。

將此概念轉換稱爲T。假設部分應用程序意味着可選參數仍然是可選的(不必是通用的,但是再次,熟悉的函數式編程語言 - Haskell等 - 甚至不具有可選參數),至少有兩個從f獲得g的方法。

    • 採取f: (a, b, c = 5, d = 0) -> {....}這需要2至4個參數。
    • 生成正好需要2個參數的新函數T(f) : (a,b) -> {...}。那就是,T(f)(a,b) = f(a,b) = f(a,b,5,0)
    • 現在對T(f)將其兩個參數固定爲1和2並調用結果函數g進行部分應用。那就是g() = T(f)(1,2) = f(1,2) = f(1,2,5,0)

    • 採取f: (a, b, c = 5, d = 0) -> {....}這需要2至4個參數。
    • f進行部分應用,將其前兩個參數固定爲1和2,並調用結果函數g'。那就是,g' : (c=5, d=0) -> f(1, 2, c, d)。它需要0到2個參數。
    • 生成新的函數T(g) :() -> {....},它只需要0個參數。那就是T(g)() = g'() = g'(5, 0) = f(1, 2, 5, 0)

在任何情況下,在問題的窘境似乎取決於T,而非功能編程或鑽營或局部應用的任何方面。我不知道T是否有足夠的標準名稱,但「固定/綁定默認參數」應該沒問題。

相關問題