
2.15 實作柯里化(Currying)功能
|
75
前文範例提供的
Curry
函數工作原理如下:建立一個表示式以
ValueQ
指令判斷指定函數
(第一個引數)搭配指定的參數(第二個引數)是否可求值,如果可以便直接求值,否
則便回傳柯里化版本的純函數。這個技巧重點在於,此表示式必須保留函數暫緩執行格
式,直到
ValueQ
通過並進行求值為止,然而純函數部分必須維持柯里化格式,因此我
們以
z
作為第二輪
ReplaceAll
(
/.
)的預留位置,以柯里化格式取代之。
我承認這個方式有些技巧性,但如果肯動手嘗試的話,你會更加了解 Mathematica 在發
展函數新行為的強大能力。要了解
Curry
函數的原理,可以先不要解開暫緩執行格式
(
Hold
),並於進行求值之前檢查每一步的結果。
當
Hold
格式解開時,
ValueQ[f[10]]
會回傳 false,因此回傳
f[10]
的柯里化格式純函
數,並等待後續的引數序列
##1
。
當以上的
Hold
格式解開時,
ValueQ
仍然回傳 false,因為函數
f
需要有三個引數才能求
值,因此我們可進一步得到
f[10][20]
的柯里化格式純函數,仍繼續等待後續的引數序
列
##1
。
最後,當提供第三個引數時,
f[10,20,30]
可進行求值,
ValueQ
終於回傳
true
,此時便
回傳表示式
f[10,20,30]
。
以下實作一個有用的附加功能:在不提供第一個引數的情況下建立自我柯里化的函數。
[Page-076]
ch02.indd 75 2014/4/2 上午 03:32:47