如何向一個只有命令式編程背景的人解釋函數式編程中的函數?
應該跟它講Combinator模式(名著類 - ajoo)。如果你看不懂的話你可以趁機學習一下。然後等他學會了,你就跟他說,這些Combinator在函數式語言裡面都是函數。
函數式裡面的函數和面向過程裡面的函數很相似,總的來說,函數式裡面的函數有三個重要的特徵,而這三個特徵就是函數的全部:
1、函數有一個參數和一個返回值。
2、無論什麼情況下同一個函數對確定的參數始終有同樣的的返回值。3、函數的參數和返回值可以是函數。類似數學裡的函數,函數按值傳參,函數不依賴內部的狀態,函數之間share nothing,因此沒有side effect。
函數式編程的好處是可以並行執行,而且由於share nothing,所以不需要鎖。因而容易開發出並行計算的軟體
就像數學公式裡面那個
簡單點說就是函數指針,主要特徵是可以作為其它函數的參數或返回值。
但是如果像通常的外行一樣又問:「這有什麼意義?」,這就有點麻煩了,如果他內心沒有準備好接受新觀念,費盡口舌也是沒有用的。命令式編程以序列化命令為基礎,通過增加並發來模擬世界。函數式編程以完全並發為基礎,通過增加序列來模擬世界。
強化版的函數指針。
集合間的映射,這個高一學。
告訴它這些都是表達式。
某一語言中的函數的性質,和這個語言是否支持過程式或函數式範式,沒有關係。function、closure、method、lambda、proc等等,在某些語言里可能指同一個概念,性質相同用法一致。但在另一些語言里可能有微妙的差異,不是同一個概念。不是統統能用「函數」來概括的。
Haskell的函數的性質,也不是所有支持函數式範式的語言共有的。ML和erlang的函數就是不純的。支持過程式範式的語言里的函數,也可能可以作為參數或者返回值或者賦給變數,例如js、lua、golang。
所以函數這個東西,只能具體語言具體分析。飆英文嚇暈他。
In computer science, functional programming is a programming paradigm—a style of building the structure and elements of computer programs—that treats computation as the evaluation of mathematical functions and avoids changing-state and mutable data.
Functional programming
-----------------------------------------------------割----------------------------------------------------------------------------------『泛函分析』(Functional analysis)這個『泛函』用的也是Functional這個單詞,難道是巧合?讓他在程序所有語法上可能的地方加上const,他很快會重新發明函數式編程的
函數可以在變數中傳來傳去
枕邊的函數「氏」 - Yang的後花園 - 知乎專欄
推薦閱讀:
※如何看待編程語言越來越大的趨勢?
※怎樣理解 Continuation-passing style?
※如何用Haskell實現面向對象編程?
※怎樣理解 Partial Evaluation?
※請問大家了解函數式語言編譯器的實現技術嘛?
TAG:函數式編程 |