標籤:

如何向一個只有命令式編程背景的人解釋函數式編程中的函數?


應該跟它講Combinator模式(名著類 - ajoo)。如果你看不懂的話你可以趁機學習一下。然後等他學會了,你就跟他說,這些Combinator在函數式語言裡面都是函數。


函數式裡面的函數和面向過程裡面的函數很相似,總的來說,函數式裡面的函數有三個重要的特徵,而這三個特徵就是函數的全部:

1、函數有一個參數和一個返回值。

2、無論什麼情況下同一個函數對確定的參數始終有同樣的的返回值。

3、函數的參數和返回值可以是函數。


類似數學裡的函數,函數按值傳參,函數不依賴內部的狀態,函數之間share nothing,因此沒有side effect。

函數式編程的好處是可以並行執行,而且由於share nothing,所以不需要鎖。因而容易開發出並行計算的軟體


就像數學公式裡面那個


簡單點說就是函數指針,主要特徵是可以作為其它函數的參數或返回值。

但是如果像通常的外行一樣又問:「這有什麼意義?」,這就有點麻煩了,如果他內心沒有準備好接受新觀念,費盡口舌也是沒有用的。


初次接觸lisp看SICP剛兩天的時候給我的電腦盲好基友講的 大神誤噴。。


命令式編程以序列化命令為基礎,通過增加並發來模擬世界。函數式編程以完全並發為基礎,通過增加序列來模擬世界。


強化版的函數指針。


集合間的映射,這個高一學。


告訴它這些都是表達式。


某一語言中的函數的性質,和這個語言是否支持過程式或函數式範式,沒有關係。

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:函數式編程 |