函數語言程式設計::高階函式::上

NO IMAGE

注:雖然我主要是C 程式設計師,但是C 型別系統太靜態太強大,於是本部落格中一部分函式甚至都沒法在C 中型別宣告出來,於是我選擇用JavaScript來進行編寫。

測試方法異常簡單,只需要隨便找一個前端工程師請他幫忙寫一個html形式的測試網頁【吧】

@國棟 (雖然沒有At功能)的《從泛值到泛型以及泛函(中)》(OSChina版:https://my.oschina.net/goldenshaw/blog/903273 個人網站版:https://xiaogd.net/%E9%87%8D%E5%A4%8D%E6%80%A7%E7%AE%A1%E7%90%86-%E4%BB%8E%E6%B3%9B%E5%80%BC%E5%88%B0%E6%B3%9B%E5%9E%8B%E4%BB%A5%E5%8F%8A%E6%B3%9B%E5%87%BD%EF%BC%88%E4%B8%AD%EF%BC%89/)裡面,討論了一個關於高階函式的主題,已經討論地超好了。但是高階函式有兩個方面,即返回函式的函式和接受函式的函式,這面就班門弄斧,討論一下返回函式的函式。

假設我們要做一個初級程式設計師入門必做程式:max函式。

這太簡單了,在作者說完的一瞬間你就編好了

function max(a,b)
{
if(a>b)
{
return a;
}
else
{
return b;
}
}
function test()
{
alert(max(1,2));
}

然後,部落格作者冷笑一聲:

你以為部落格這麼裝逼的標題和開頭放在這就是為了給你演示這個max嗎

兩個引數不夠,你這個函式要支援一到五個引數      !

 

你:CNM還以為這麼有氣勢的開頭是什麼絕世難題呢

function max_bottom(x,y)
{
if(x>y)
{
return x;
}
else
{
return y;
}
}
function max(a,b,c,d,e)
{
return max_bottom(max_bottom(max_bottom(a,b),c),max_bottom(d,e));
}
function test()
{
alert(max(1,2,3,4,5));
}

max裡面的程式碼有點亂,於是你整理了一下

function max_bottom(x,y)
{
if(x>y)
{
return x;
}
else
{
return y;
}
}
function max(a,b,c,d,e)
{
return max_bottom(max_bottom(max_bottom(max_bottom(a,b),c),d),e)
}
function test()
{
alert(max(1,2,3,4,5));
}

部落格作者:你耳朵還好嗎?

我說一到五個引數你怎麼只實現了五個引數?

如果alert(max(1,2,3))妥妥的undefined啊

 

你:那炒雞簡單,只需要從後往前逐個檢查是不是===undefined就可以計算出引數數量,然後召喚對應的bottom函式

但是你知道,部落格作者他特麼是一個變態(手動變黃),今天能做一到五個引數,明天就能做一到五千個引數,後天就能做·了·你(請用滑鼠選中方式閱讀,18歲以下禁止閱讀,手機就算了吧反正幾個字塞不進一個非純愛言情小說)

這樣硬編碼下去,用不了幾個小時你就會暈倒在電腦前(巨集操作請無視這句話),然後被部落格作者           (請用滑鼠選中方式閱讀,18歲以下禁止閱讀,手機就算了吧反正幾個字塞不進一個非純愛言情小說)

沒錯部落格作者男女通吃

於是,你經過一番深思熟慮,給出了一個陣列的實現方案

function max(arr)
{
var x;
var maxNum;
for (x in arr)
{
if((maxNum===undefined)||(maxNum<arr[x]))
{
maxNum = arr[x];
}
}
return maxNum;
}
function test()
{
alert(max(new Array(3,2,1,3,2,5,1,2,4,2,54,1,3,3,2,1,4,3)));
}

然而,部落格作者他不講理,偏要讓你用硬編碼累到在電腦前 【其實是因為這樣的話就不能裝逼

於是他問:

有沒有更裝逼的方法

 你回答:

沒了,剩餘都是優雅不足裝逼有餘的方法。順便如果你是用C,我可以幫你貼一段位運算求max

作者說: 

垃圾

於是他貼了一段這樣的程式碼

function max(a)
{
var maxNum;
var max2 = function(x)
{
if(x===undefined)
{
return maxNum;
}
if((maxNum === undefined)||(maxNum < x))
{
maxNum = x;
}
return max2;
}
return max2(a);
}
function test()
{
alert(max(3)(2)(1)(3)(2)(5)(1)(2)(4)(2)(54)(1)(3)(3)(2)(1)(4)(3)());
}

厲不厲害,就問你厲不厲害!

這比你那個用陣列的優雅好多!

關鍵是拿出去裝逼,6到飛起來!

你:

閉嘴。

至於這段程式碼的原理:

這段程式碼每次呼叫都會返回一個略有修改的函式(這個函式又會返回一個函式(這個函式又會返回一個函式(Error 96:棧溢位))),直到傳進去一個undefined。

簡單說,作者這個表達能力-98的也幫不了你,自己問其他大牛去

所以,這個就是高階函式的另一面:返回一個函式!

你:

你就胡扯吧

咳咳,這個純屬用來裝逼的例子只是用來拋磚引玉

接下來還有更精彩的【如果作者沒有棄坑】