關於FP的一些概念

2021-06-29 01:43:38 字數 2120 閱讀 9435

全名為(functional programming函式式程式設計 )函式式程式設計是一種設計、編制和除錯函式式程式的技術。函式式程式是由一些原始函式、定義函式和函式型組成的函式表示式。

lambda calculus 在數學定義上面非常簡單,並且和與圖靈機等價,也就是說fp語言程式與普通的命令式語言如c可以寫出同樣能力的程式。

乙個 lambda 定義就是乙個:  

lambda 《引數》 : 《函式體》  

這個定義可以應用到引數上,進行求值。

例(py): 

>>> (lambda x : x + x)(5)

10在數學定義中 lambda 只有乙個引數,我們可以通過 currying 來實現組合多個引數的能力:

例:>>> (lambda x : (lambda y : x + y))(1)(2)

3這裡面所包含的思想是「函式本身也是資料,也是值,可以被傳遞,可以被計算!",在上面的例子中, "第乙個函式接受乙個引數並返回另乙個接受另乙個引數的函式",這聽起來有些繞,我們分解來看:

lambda x :  接受乙個引數x, 這個定義返回如下的值:

(lambda y: x + y)  這個值是另乙個lambda定義,它接受另乙個引數y.

closure在我自己的理解就是表示資料的層次性.

closure我曾經見到有本書翻譯成"閉包",封閉(closure),或者叫完全有界(complete bounding)。這裡的有界和一階邏輯謂詞中的有界是乙個意思. 

比如 (lambda x : x + x) , x出現在 lambda x : ....的參數列中, x 就被包含在這個lambda的  context 裡面. 再比如前面 currying 的那個例子:

(lambda x : (lambda y : x + y))  y 出現在內層的 lambda 中,它的 context就是內部的那個lambda.  而沒有出現在 lambda .. 這裡的變數就是自由變數.在這裡內部的  lambda y : x + y 中, x 是乙個自由變數, y 是有界變數. 在整個  lambda x : ... 的定義中,x,y 都是有界變數.

例: >>> y = 2

>>> (lambda x : x + y)(4)

6y 沒有出現在 lambda 的參數列中,這裡它繫結的是外部context中的 y, 是乙個自由變數.

另乙個例子: 

>>> a = 1

>>> (lambda a : a + 1)(2)

3當乙個 lambda表示式的所有變數都有界時,此表示式才完全合法.

就是說lambda表示式中的引數名稱可以隨意替換, 名字本身不重要.通過alpha轉換可以實現遞迴等操作.

例: lambda x, y : x + y

與lambda a, b : a + b 完全等價.

beta規則無非是說,應用乙個函式(也就是lambda表示式。乙個意思)等價於通過把函式體內有界的變數替換成應用裡對應引數的實際值來替換原來的函式。

例:  (lambda x, x + 2) (1)   相當於把 1 替換掉x, 於是得到: 1 + 2

另乙個例子:

>>> f = (lambda y : (lambda x : x + y))(5)

>>> f(2)

7>>> f(1)

6這裡應用乙個函式生成了乙個 add5 的函式, 動態語言的強大哦, :d

上面的例子,相當於生成了:   lambda x : x + 5 這樣乙個表示式.

再看乙個例子:

>>> (lambda x, y : x(y))(lambda x : x * x, 3)

9>>> 

這個例子中, lambda x, y  將x 應用到 y 上. 其中 x 替換成  lambda x : x * x , y 替換成 3.

beta的嚴格定義如下:

lambda x . b e = b[x := e] if free(e) /subset free(b[x := e]

這條規則是為了保證出現命名衝突的時候,先進行 alpha 替換,然後再應用 beta 簡化.

至此, 通過 lambda , currying, closure, alpha, beta 已經定義出乙個"完備"的計算體系. 在此之上,我們可以繼續構造出更複雜的程式.

關於KVM一些概念

kvm kernel virtual machine核心虛擬機器 是乙個linux核心模組,可以用modprobe去載入kvm模組。載入模組後,才能進一步通過其他工具建立虛擬機器。但僅有kvm模組是不行的,因為使用者無法直接控制核心模組去作事情,所以還要有乙個使用者空間的工具才行。這個使用者空間的工...

關於uboot一些概念

u boot的環境變數值得注意的有兩個 bootcmd和bootargs。bootcm bootargs bootargs是環境變數中的重中之重,甚至可以說整個環境變數都是圍繞著bootargs來設定的。bootargs的種類非常非常的多,我們平常只是使用了幾種而已.bootargs非常的靈活,核心...

關於Socket的一些概念

對於 tcp ip 我們還知道 tcp和 udp,前者可以保證資料的正確和可靠性,後者則允許資料丟失。最後,我們還知道,在建立連線前,必須知道對方的 ip位址和埠號。除此,普通的程式設計師就不會知道太多了,很多時候這些知識已經夠用了。最多,寫服務程式的時候,會使用多執行緒來處理併發訪問。我們還知道如...