javascript之典型高階函數應用介紹二_javascript技巧
在前一篇文章javascript之典型高階函數中主要實現了幾個典型的functional函數。文章最後也提出了疑問,為啥那樣的實作與F#之類的函數式語言「不太一樣」呢?今天來試試更「函數式」的實作。
另一個實作
同樣地,試著對先前實現的函數做一些改動,把for循環去掉。如何去掉呢?這裡先要引入一個集合的歸納法定義:
一個集合要麼是空集,要麼是一個數與一個集合組成的數對從定義可以看到,每一個集合都可以看作為一個數和一個集合的對。例如:{1,2,4,5} 可以認為是數 1 與 集合{2,4,5} 組成的一對,寫成(1 , {2,4,5})。遞歸地,{2,4,5} 可以看成是(2 , {4,5})。最後即為 (5 , Ø)。依照這樣的理解,我們就可以用遞歸的方法消除循環,因為我們在分解的時候已經存取了每一個資料項,並且終結條件為空集合。下面就來看看filter函數的另一個實現,原函數名稱加前綴f以區別之前函數:
function ffilter(arr,callback){
var i=arguments[2] || 0,
out = arguments[3] || [];
if (!arr[i]) return arguments[3];
if(callback(arr[i]))
out.push(arr[i]);
return arguments.callee(arr,callback , i,out);
}
測試:
var arr = [1,2,3,4,5,6,7,8,9,10];
var even = function(item){
if( typeof item !== "number") return false;
return !(item & 1);
};
console.log(ffilter(arr,even));
結果:
[2, 4, 6, 8, 10] 這樣消除循環之後,更貼近於數學的歸納定義,顯得更自然。同樣地,再看一下ffold函數:
var arr = [1,2,3,4,5,6,7,8,9,10];
var plus = function(a,b){
return a b;
};
console .log(ffold(arr,plus,3));
結果:
58
其他函數以相同的方法即可。這樣就感覺更functional 了,但能不能再與數學定義更接近呢?下次再嘗試。
==========2013.1.8 更新==================
上面說到了那些寫法能否與數學定義更接近,下面就試試看使用鍊錶。先給一個定義:
var node = function() {
this.data = 0;
this.tail = null;
};
再初始化一個鍊錶:
var n1 = new node(),n2 = new node(),n3 = new node(),n4 = new node(),n5 = new node();
n1.data=1,n1.tail=n2;
n2.data=2,n2.tail=n3;
n3.data=3,n3.tail=n4;
n4.data=4,n4.tail=n5;
n5.data=5,n5.tail=null;
fold鍊錶版本:
function oldor ,b){
if(!head) return b;
else return callback(head.data,arguments.callee(head.tail,callback,b));
}
輸出結果:
18
依照先前的定義,一個集合要麼是空集,要麼是一個「頭」與一個「尾」(集合)組成的數對。每次呼叫函數時,分解為head和tail,直到集合為空(寫完上面的lfold函數真心感覺太完美了,簡直就是定義,要是程式都長這樣,註解都不需要了,真是一種享受) 。這樣子算是最接近數學定義的表示了。因為javascript不支援很多函數式語言的match,所以不能「自動」分解,也不能直接表示歸納定義。
javascript除了以上的一些東西,還可以實現函數式裡面的partial,dojo框架裡面的hitch就做到了這一功能,這也是函數式貼近數學的另外一個明顯的例子。我將在下一篇部落格中討論。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP是一種廣泛使用的伺服器端語言,許多Web開發人員喜歡使用PHP的原因之一是它豐富的函數庫和簡單易用的函數語法。而函數式程式設計則是一種程式設計範式,它很好地封裝資料和行為,使得程式碼更加模組化,易於維護和測試。在這篇文章中,我們將介紹如何使用PHP進行函數式程式設計。函數式程式設計基礎函數式程式設計的核心思想是將函數視為一等公民,函數本身可以像變數一樣被傳遞、傳回、組合

在Python中,將另一個函數作為參數或將函數作為輸出返回的函數稱為高階函數。讓我們來看看其特性-該函數可以儲存在變數中。該函數可以作為參數傳遞給另一個函數。高階函數可以以列表、雜湊表等形式儲存函數可以從函數中傳回。讓我們來看一些範例−函數作為物件Example的中文翻譯為:範例在這個範例中,這些函數被視為物件。在這裡,函數demo()被賦值給一個變數-#Creatingafunctiondefdemo(mystr):returnmystr.swapcase()#swappingthecase

高階函數有map()、filter()、reduce()、lambda函數、partial()等。詳細介紹:1、map():這個內建函數接受一個函數和一個或多個可迭代物件作為輸入,然後傳回一個將輸入函數應用於可迭代物件的每個元素的迭代器;2、filter() :這個內建函數接受一個函數和一個可迭代物件作為輸入,然後傳回一個迭代器,該迭代器產生那些使得輸入函數傳回True的元素等等

PHP箭頭函數:如何處理高階函數的巢狀調用,需要具體程式碼範例引言:在PHP7.4版本中,引入了箭頭函數(arrowfunctions)的概念,箭頭函數是一種簡潔的寫法,能夠優雅地處理高階函數的巢狀呼叫。本文將介紹箭頭函數的基本使用方法,並透過具體程式碼範例示範如何處理高階函數的巢狀呼叫。一、什麼是箭頭函數?箭頭函數是PHP7.4版本引入的新特性,它是一

簡介Python的高階函數世界如果您想提高Python程式設計能力並產生更具表現力和更有效的程式碼,那麼您來對地方了。 Python中的函數不僅僅是專門的程式碼區塊。它們也是可以移動、轉移、甚至是動態產生的強大東西。透過處理其他函數,高階函數增強了這種多功能性。本文將廣泛討論高階函數的原理。我們將探索作為一流物件的進程的基礎知識,深入研究高階函數的現實世界範例,並鼓勵lambda函數的功能以實現清晰而美觀的程式碼。也將討論函數式程式設計模型及其在Python中使用時的優點。讀完本文後,您將牢牢掌握高階函數,並且知道

隨著Golang語言的流行和發展,越來越多的開發者開始嘗試使用函數式程式設計的想法。 Golang中的高階函數為函數式程式設計帶來了很大的便利性,並且在實際開發中應用廣泛。那麼,Golang函數的高階函數應用場景是什麼呢?接下來,我們將對此進行分析。函數參數和傳回值的處理在Golang中,函數可以作為其他函數的參數或傳回函數。這就意味著我們可以將函數作為一個參數傳入另

PHP是一種廣泛使用的伺服器端語言,許多Web開發人員喜歡使用PHP的原因之一是它豐富的函數庫和簡單易用的函數語法。而函數式程式設計則是一種程式設計範式,它很好地封裝資料和行為,使得程式碼更加模組化,易於維護和測試。在這篇文章中,我們將介紹如何使用PHP進行函數式程式設計。函數式程式設計基礎函數式程式設計的核心思想是將函數視為一等公民,函數本身可以像變數一樣被傳遞、傳回、組合

高階函數是在Python中一個非常有用的功能函數,所謂高階函數就是一個函數可以用來接收另一個函數當參數,這樣的函數叫做高階函數。
