離散數學中的閉包和計算機語言中的閉包有聯繫嗎?
12-12
根據Wikipedia條目(http://en.wikipedia.org/wiki/Closure_(computer_science)#History_and_etymology),尤其是註解4、5、6,可知計算機語言中的clourse用法是P.J. Landin發明的,意思其實就是closed expression。即lambda表達式中本來open的bindings(即free variables)被close後的結果。
沒有證據表明Landin創造的這個術語與數學中的closure概念有直接的關係。@Ivony 的說法我認為只是源於兩者用了相同的辭彙,所以必然與close這個單詞的意思相關而已。沒有半點關係,SICP里第二章注釋6:
The use of the word ``closure"" here comes from abstract algebra, where a set of elements is said to be closed under an operation if applying the operation to elements in the set produces an element that is again an element of the set. The Lisp community also (unfortunately) uses the word ``closure"" to describe a totally unrelated concept: A closure is an implementation technique for representing procedures with free variables.有聯繫,雖然聯繫並不明顯。
朱兆龍童鞋搞混了閉包和閉合:
在離散數學(具體的說是抽象代數)里,如果對一個集合中的每個元素執行某個運算操作,得到的結果還是這個集合的元素,那麼就說該集合在這個運算操作下構成閉包。例如,整數集合在減法運算下構成閉包;但是自然數在減法運算下不構成閉包。
如果一個集合中的每個元素執行某個運算還是這個集合的元素,那麼說該集合在這個運算下閉合。
閉包的定義是,包含指定集合的滿足在某個運算下閉合的最小集合。
說白了,閉包就是,添加最少的元素,使得集合在某個運算下閉合。抽象之,閉包是指添加東西使得某種性質成立。
那麼程序設計語言裡面的閉包又是什麼呢?函數使用函數外的變數,如若使用的函數外的變數不是全局變數,將自動創建閉包,令內部函數所使用的變數與函數一同存在,使得該函數有效。
也就是說閉包就是自動為這個函數添加一個隱形的參數,其值為使用的外部變數,並確保其與函數一同存在,使得函數有效。
簡單的說,這兩個概念幾乎沒有聯繫(也許有,但是我沒有發現)。我簡單的解釋一下兩個閉包在兩個領域中的含義:
1,在離散數學(具體的說是抽象代數)里,如果對一個集合中的每個元素執行某個運算操作,得到的結果還是這個集合的元素,那麼就說該集合在這個運算操作下構成閉包。例如,整數集合在減法運算下構成閉包;但是自然數在減法運算下不構成閉包。
2,在編程語言里,也稱為詞法閉包或者函數閉包,它表示的是一個函數,以及一個定義這個函數時的環境(環境里記錄了非本地變數的值)。例如(橫線是為了對齊):
def counter():
----x = 0
----def increment(y):
--------nonlocal x
--------x += y
--------print(x)
----return increment
這個例子用的是python 3.X的語法,一直覺得python的閉包的實現不美觀,不如lisp、ruby等。
參考自:
1,http://en.wikipedia.org/wiki/Closure_(computer_science)
2,http://en.wikipedia.org/wiki/Closure_(mathematics)
沒什麼聯繫
我不想提這個問題,只是,離散說的閉包和函數閉包是一樣的,可以認為是等價命題
推薦閱讀:
TAG:JavaScript | 數學 | 計算機 | 計算機科學 | Scheme | 計算理論 | 計算機語言 | 離散數學 | 閉包 |