函數(shù)柯里化 阮一峰 哪些編程語言是函數(shù)式的?
函數(shù)編程是一種編程范式,它把計算機操作看作函數(shù)計算。λ演算是函數(shù)程序設(shè)計語言的重要基礎(chǔ)。λ演算函數(shù)可以接受該函數(shù)作為輸入(參數(shù))和輸出(返回值)。與指令編程相比,函數(shù)編程強調(diào)函數(shù)計算比指令執(zhí)行更重要。
函數(shù)編程是一種編程范式,它把計算機操作看作函數(shù)計算。λ演算是函數(shù)程序設(shè)計語言的重要基礎(chǔ)。λ演算函數(shù)可以接受該函數(shù)作為輸入(參數(shù))和輸出(返回值)。與指令編程相比,函數(shù)編程強調(diào)函數(shù)計算比指令執(zhí)行更重要。與過程編程相比,函數(shù)計算在函數(shù)編程中可以隨時調(diào)用。所以JavaScript是一種函數(shù)式編程語言。
哪些編程語言是函數(shù)式的?
面向?qū)ο筇貏e符合人類認識世界的思維方式。OOP的興起源于大規(guī)模軟件系統(tǒng)開發(fā)中對代碼管理、重用和擴展的需求。OOP為代碼結(jié)構(gòu)的合理性提供了更多的設(shè)計可能性和空間。面向?qū)ο蟮娜齻€特性,封裝、繼承和多態(tài),都是表面的特性。OOP的真正靈魂是抽象。這個概念貫穿于OOP語言的各個層次和開發(fā)的各個環(huán)節(jié)。只有深刻理解抽象,才能深刻理解OOP,充分發(fā)揮其優(yōu)勢。
函數(shù)式編程是一個非常古老的東西,這就是為什么它今天可以重用的原因。由于數(shù)據(jù)量的激增和硬件的高速發(fā)展,需要多核處理。functional最重要的特性是無狀態(tài)的,它沒有變量,因此它本身是線程安全的,這決定了它特別適合于高并發(fā)、大數(shù)據(jù)量的處理。
Face object和function都是從語言特性方面支持的編程思想,它們并不矛盾或?qū)α?。因此,我們可以利用他們的?yōu)勢來發(fā)展。這也是開發(fā)語言未來發(fā)展的一個方向,即支持人臉對象和函數(shù)表達式的多范式編程?,F(xiàn)在最典型的代表是Scala。
函數(shù)式編程(Functional Programming)相比面向?qū)ο缶幊蹋∣bject-oriented Programming)有哪些優(yōu)缺點?
首先,給出結(jié)論。為什么?
讓我們從面向?qū)ο箝_始。
當我們將面向?qū)ο笠暈橐环N語言的屬性時,c是一種面向?qū)ο蟮恼Z言嗎?眾所周知,C、Java等高級語言都是面向?qū)ο蟮?,我們通常說C語言是面向過程的。這是因為C和Java為面向?qū)ο筇峁┝撕芎玫膬?yōu)化。通過類、成員變量和方法、繼承和多態(tài)性、虛函數(shù)和重載等特性,可以對對象模型進行詳細的抽象。然而,C語言中只有結(jié)構(gòu),不能定義函數(shù),只能有成員變量。因此,在用C語言抽象對象模型時遇到了很多困難,所以通常說C語言是面向過程的。
然而,面向?qū)ο缶幊痰奶岢鍪菫榱烁玫匕l(fā)展編程思想,而不是作為語言屬性的劃分。換句話說,面向?qū)ο缶幊痰乃枷胧桥c語言無關(guān)的。利用C語言的結(jié)構(gòu),結(jié)合函數(shù)指針,我們也可以用C語言實現(xiàn)類的各種函數(shù),但是我們做了很多其他高級語言的編譯器需要做的事情,這對開發(fā)人員很不友好,維護成本也很高。
如果你問我,我想說的是,c是一種面向?qū)ο蟮恼Z言嗎?我也會說是的。因為面向?qū)ο笫且环N思想,而不是分區(qū)語言的屬性。
最后,讓我們回到問題。函數(shù)表達式意味著我們可以打包代碼并保留接口。一個函數(shù)可以從接口調(diào)用其他函數(shù)的返回值,并使用自己的返回值作為其他函數(shù)調(diào)用的接口。這也是一個設(shè)計理念。這樣,我們可以很容易地將項目模塊化,實現(xiàn)模塊間的解耦。
無論是語言本身對于函數(shù)式編程的支持和優(yōu)化,還是從編程思想的實現(xiàn)來看,C語言顯然是符合這一特點的。
C語言是函數(shù)式編程語言嗎?
curricization和Scala之間沒有必然的關(guān)系,這是函數(shù)式編程的特點。
在計算機科學中,currying是一種技術(shù),它將接受多個參數(shù)的函數(shù)轉(zhuǎn)換為接受單個參數(shù)(初始函數(shù)的第一個參數(shù))的函數(shù),并返回一個接受其余參數(shù)并返回結(jié)果的新函數(shù)。這項技術(shù)是以克里斯托弗·斯特拉奇的邏輯學家哈斯克爾·庫里的名字命名的,盡管它是由摩西·施芬克爾和戈特洛布·弗雷格發(fā)明的。
直觀地說,currierization聲稱“如果您修復了一些參數(shù),您將得到一個接受其余參數(shù)的函數(shù)。”。對于兩個變量的函數(shù)YX,如果y=2是固定的,那么我們得到一個變量的函數(shù)2x。
在理論計算機科學中,currification提供了一種在簡單的理論模型中研究多參數(shù)函數(shù)的方法,例如只有一個參數(shù)的lambda微積分。
scala柯里化有什么用?
一切都是為了簡潔
!Java語言擁有成熟的技術(shù)社區(qū)和豐富的類庫,以及模式化的開發(fā)模式一直是企業(yè)應用的寵兒,但正因為如此,代碼冗余、開發(fā)復雜一直備受詬病!為了改變這種現(xiàn)象,Oracle在收購Java之后,一直致力于Java的簡潔開發(fā)。近年來,Scala是一種非常流行的編程語言,因為它不僅融合了面向?qū)ο蟮乃枷?,而且具有函?shù)式編程的特點,這非常符合現(xiàn)在簡潔開發(fā)的理念
!一句話,未來新版Java將提供更兼容的功能開發(fā)開發(fā),不是說功能開發(fā)比面向?qū)ο笳Z言更好,而是為了得到你需要的東西,走向更美好的明天。未來的編程語言是否沒有特點,值得期待。。
為什么感覺Java越來越傾向于函數(shù)式編程?是由實際問題驅(qū)動的嗎?
學習大數(shù)據(jù)技術(shù)需要掌握Scala。
但是,在學習Scala之前,您最好在一定程度上了解java和任何函數(shù)式語言(Haskell、SML等),特別是在您可以在編程范式之間自由切換之后。
Scala不偏向大數(shù)據(jù)方向的科學研究。它被用于許多地方,如火花。
1,JVM基礎(chǔ),與Java完全兼容。對于堅實的java基礎(chǔ)的學生,學習斯卡拉非常友好!2!在普通工具中,水槽和Hadoop是用java編寫的,Scale和卡夫卡是Scala編寫的。
所以對于想學習大數(shù)據(jù)的學生來說,Scala確實是最受推薦的。
作為一種相對較新的語言,Scala有一個混亂的社區(qū)。在scala社區(qū)中有許多不同的嘗試,主要是Java和Haskell,以及actor和reactive編程。如果你還沒有掌握一個成熟的編程范例,我認為你很可能買不起Scala。!當java編程基礎(chǔ)很好的時候,學習Hadoop系統(tǒng),然后安排學習Scala,然后學習Scale,卡夫卡等等。這個順序更科學合理,更容易讓大家掌握。
推薦書籍:Scala編程,Scala函數(shù)編程https://www.toutiao.com/i6543924910664712718/