使用匿名函式進行函數語言程式設計
匿名函式可用於函式程式設計。要解決的主要問題是沒有本地方法來錨定遞迴,但這仍然可以在一行中實現:
if_ = @(bool, tf) tf{2-bool}();
此函式接受布林值和兩個函式的單元陣列。如果布林值的計算結果為 true,則評估第一個函式;如果布林值的計算結果為 false,則計算第二個函式。我們現在可以輕鬆編寫階乘函式:
fac = @(n,f) if_(n>1, {@()n*f(n-1,f), @()1});
這裡的問題是我們不能直接呼叫遞迴呼叫,因為在評估右側時函式尚未分配給變數。但是,我們可以通過寫作完成這一步驟
factorial_ = @(n)fac(n,fac);
現在,@(n)fac(n,fac)
遞迴地評估階乘函式。使用 y-combinator 進行函數語言程式設計的另一種方法,也可以很容易地實現:
y_ = @(f)@(n)f(n,f);
使用此工具,階乘功能甚至更短:
factorial_ = y_(fac);
或直接:
factorial_ = y_(@(n,f) if_(n>1, {@()n*f(n-1,f), @()1}));