函数式编程笔记 01
Cousera 上 Functional Programming Prinples in Scala 的筆記。
編程范式
范式描述了某些科學(xué)學(xué)科中獨(dú)特的概念或者思考模式。
主要的編程范式:
- 命令式編程
- 函數(shù)式編程
- 邏輯式編程
與它正交:
- 面向?qū)ο缶幊?/li>
命令式編程
- 修改可變變量
- 賦值
- 諸如if-then-else、loops、break、continue、return等的控制結(jié)構(gòu)
簡(jiǎn)單來理解,命令式編程就是Von Neumann計(jì)算機(jī)上的指令序列。
命令式的程序和計(jì)算機(jī)
- 可變變量 ≈ 內(nèi)存單元
- 變量解引用 ≈ load指令
- 變量賦值 ≈ store指令
- 控制結(jié)構(gòu) ≈ jump指令
這在程序規(guī)模變大時(shí)會(huì)出現(xiàn)問題。怎樣才能避免逐字的翻譯式的編程?
John Backus 1978年在Turing Award上的講稿:Can Programming be Liberated from the von. Neumann Style?
Jone Backus是第一個(gè)高級(jí)語言Fortran的發(fā)明者。
規(guī)模增大
純命令式編程被Von Neumann所限制:
“One tends to conceptualize data structures word-by-word”
需要其他的方式來定義類似于集合、多項(xiàng)式、幾何圖形、串、文檔等這些高級(jí)的抽象。
理想的方法是提出集合、形狀、串等的定理。
什么是定理
定理包括
- 一個(gè)或多個(gè)數(shù)據(jù)類型
- 這些類型上的運(yùn)算符
- 值和運(yùn)算符之間關(guān)系的規(guī)則
定理并不描述變化!
定理不包括變化
一個(gè)定義兩個(gè)多項(xiàng)式的和的例子:
(a * x + b) + (c * x + d) = (x + c) * x + (b + d) 復(fù)制代碼它并沒有定義一個(gè)在改變系數(shù)的同時(shí)保持多項(xiàng)式相等的運(yùn)算符!
但是在命令式編程中卻可以這樣寫:
class Polynomial { double[] coefficient; } Polynomial p = …; p.coefficient[0] = 42; 復(fù)制代碼(系數(shù)coefficient[0]變了但多項(xiàng)式p沒變)
另外一個(gè)例子是字符串中的++運(yùn)算符:
(a ++ b) ++ c = a ++ (b ++ c) 復(fù)制代碼它并沒有定義一個(gè)在改變序列元素的同時(shí)保持序列相等的運(yùn)算符!
Java在這兒做的不錯(cuò)……它的String是不可變的。
對(duì)編程的影響
如果想根據(jù)它們的數(shù)學(xué)定理來實(shí)現(xiàn)高級(jí)概念,那就沒有變化的地方。
- 數(shù)學(xué)不承認(rèn)它
- 變化會(huì)毀掉定理中有用的規(guī)律
因此
- 用函數(shù)來表達(dá)運(yùn)算符的定理
- 避免變化
- 有了一個(gè)強(qiáng)大的方法來抽象和構(gòu)造函數(shù)
函數(shù)式編程
- 在狹義上,函數(shù)式編程意味著沒有可變變量,賦值,循環(huán)和其他的命令式控制結(jié)構(gòu)
- 在廣義上,函數(shù)式編程意味著專注于函數(shù)
- 特別是,函數(shù)可以是能被產(chǎn)生、消耗和構(gòu)造的值
- 這在函數(shù)式語言中都特別簡(jiǎn)單
函數(shù)式編程語言
函數(shù)是一等公民。
- 在任何地方都可以被定義,包括在另一個(gè)函數(shù)內(nèi)部
- 像其他值一樣,可以作為參數(shù)傳遞給其他函數(shù),也可以作為值返回
- 像其他值一樣,有一套構(gòu)造函數(shù)的運(yùn)算符
狹義上的函數(shù)式編程語言:
- Pure Lisp, XSLT, XPath, XQuery, FP
- Haskell (without I/O Monad or UnsafPerformIO)
廣義上的函數(shù)式編程語言:
- Lisp, Scheme, Racket, Clojure
- SML, Ocaml, F#
- Haskell (full language)
- Scala
- Smalltalk, Ruby
函數(shù)式編程語言歷史
- 1959 - Lisp
- 1975-77 - ML, FP, Scheme
- 1978 - Smalltalk
- 1986 - Standard ML
- 1990 - Haskell, Erlang
- 1999 - XSLT
- 2000 - OCaml
- 2003 - scala, XQuery
- 2005 - F#
- 2007 - Clojure
資源
Leaning Resources
總結(jié)
以上是生活随笔為你收集整理的函数式编程笔记 01的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 亚马逊《辐射》剧集片场照流出,最早今年上
- 下一篇: KDE 和 GNOME 联手重塑 Fla