函式式程式設計

2021-09-22 16:22:52 字數 2104 閱讀 7688

函式式程式設計(functional programming)之前都只是聽說過,沒有使用過所謂的函式式程式設計思想。不大理解這個概念。最近弄python的時候遇到了這個概念。

函式式程式設計對應的是命令式程式設計(imperative programming)。我們平時寫的程式大都屬於這種程式設計方式:如果a大於b,就執行這個操作,否則的話,就執行這樣的操作。我們一直研究的物件導向的程式設計也便是屬於命令式程式設計的一種。

函式式程式設計最重要的是一切都是函式。這裡的一切包括什麼?函式可以是變數麼?可以。函式可以是返回值麼?可以。

如果函式是變數,那麼這個把函式當作變數的函式就是高階函式。比如python中的這個函式:

#!/usr/bin/python

#coding:utf-8

def g(f, a, b):

return f(a, b)

def add(a, b):

return a + b

val = g(add, 1, 2)

print val

其中g這個函式它就是高階函式,他有乙個引數為f。

在python中,高階函式的代表就是map和reduce。比如可以看下下面的例子:

#!/usr/bin/python

#coding:utf-8

def f(a):

return a * a

def add(a, b):

return a + b

val1 = map(f, [1,2])

val2 = reduce(add, val1)

print val2

在上面例子裡面,map和reduce都是高階函式,它們的第乙個引數傳遞進去的是函式。但是當然上面的例子寫的有點low,一點都不python,一般來說,我們使用匿名函式lambda來替換傳遞進來的引數。

#!/usr/bin/python

#coding:utf-8

val1 = map(lambda x: x*x, [1,2])

val2 = reduce(lambda x,y: x+y, val1)

print val2

這裡引申的匿名函式的意思就很明顯了。它就是函式的擴充套件。

高階函式除了可以接受函式作為引數之外,還可以把函式作為返回值返回。

#!/usr/bin/python

#coding:utf-8

def multi(a, b):

def f():

return a * a + b * b

return f

val = multi(1, 2)

print val()

把函式作為返回值,上面的例子在multi的時候其實並沒有執行對應的計算,而是在print的時候才執行計算,這個是一種延遲行為。我們稱之為惰性求職(lazy evaluation)。

我們看到,在multi函式定義的a和b這兩個區域性變數,並不隨著multi呼叫而銷毀,在print這行,才具體執行的時候,a=1和b=2 還繼續存在著。這就是「閉包」的威力。

回歸到函式式程式設計,雖然說函式式程式設計是一種思維,和語言無關。但是只有實現了上述匿名函式,函式閉包等功能的語言才有函式式程式設計的能力。它最本質的觀點是,所有的程式設計思想都是以函式為基本思想。

首先,函式式程式設計認為每個函式都是封閉的,不依賴外部的資料,也不改變外部的資料。比如我們常用的oo裡面的方法,函式式程式設計就覺得不合理。

class a 

}

這裡面的isauth依賴外部的變數$isauth,所以它是不符合函式式程式設計的函式封閉原理的。

其次,函式像變數一樣使用,這一點我們上面的部分已經說明清楚了。經常說的一句話是,函式是一等公民。

比如像很多演算法裡面使用的遞迴演算法,就算是函式式思維和非函式式思維的區別。比如計算斐波那契數列,從函式式思維開始思考,我們很容易思考到遞迴演算法。而從其它思維出發,我們常常考慮的就是非遞迴解法。

public static long fib(int n)

從這個例子我們可以看出,使用函式式思想的乙個好處,非常符合我們人類直觀的理解。我們是要告訴程式要去做什麼,而不是怎麼去做。

函式式程式語言python 函式式程式設計

函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...

函式式程式設計

最近在看一些關於js方面的東東,除了些ajax的基本應用,還了解了些函式式程式設計 fp 的東東。雖然以前也玩過幾天lisp的,不過因為當時完全對fp的東西沒有概念,壓根就不知道原來這是list那一族最大的特性之一 另外我知道的還有個是gc,orz.光注意那些詭異的 表 去了。總結一下,傳統上認為f...

函式式程式設計

維基百科 函式式程式設計 英語 functional programming 或者函式程式設計,又稱泛函程式設計,是一種程式設計范型,它將計算機運算視為數學上的函式計算,並且避免使用程式狀態以及易變物件。函式程式語言最重要的基礎是 演算 lambda calculus 而且 演算的函式可以接受函式當...