函式型別在初中階段就接觸到了:
如果 如何構造這樣乙個型別的元素呢?給定乙個表示式
由這個表示式就可以構造乙個函式
那麼 這裡
是沿襲hott書[1]中的記號,代表「根據定義,前者就是後者」;也就是說,可以在任意地方將式子的左右側互換。這會在相等型別的討論中進一步解釋。
另一種寫法就是
-抽象:
(其中
可以省略為
)。這種寫法比較乾淨,可以迅速地臨時引入乙個函式,而不必在前面先說明(至於為什麼用這個字母,是因為church本來想寫
,但是印刷技術不行,印成了
,後來就演化成
)。在各大語言中都有對應物,比如python的
lambda
關鍵字、js的箭頭函式。其中,後者更接近於我們要引入的第三種記法:
注意兩個箭頭的不同寫法。在hott書[1]中還有一種記法,就是將函式的自變數寫作「
」,舉個例子,
就是 的簡記法。作為乙個語法糖還是不錯的。
上面講了構造,那麼我們如何使用乙個已經構造好的元素呢?舉個例子,如果
,我們就有
也就是說,如果
,那麼
就是 把
中所有都替換成
,寫作
這個稱為
其實這裡有一些命名上的細枝末節。譬如
,那麼
這一點的處理,可以參見[1]的相關部分與[2]的討論。
對於任何乙個函式
,我們都可以構造乙個函式
我們可以認為這個函式跟原來那個是完全一樣的:
這個稱作
-化簡。在講外延相等與內蘊相等的時候(也在相等型別那一節)會詳細闡述。這裡
代表「雖然不是根據定義,但是兩者完全相同,可以隨意互換」。
最後,講講如何巧妙的定義多變數函式。接觸過函式式程式設計的人可能已經知道了。對於乙個多變數函式
,如果給定引數
,就可以得到函式
我們知道這個函式的型別是
換句話說,輸入乙個元素
,這個二元函式給出了乙個一元函式,型別是
;這就意味著
這個轉化稱作
柯里化。我們會頻繁地用到這個技巧,因此我們把
記作右結合的,也就是說
,這樣可以節省不少括號。
請讀者思考一下
與之有什麼不同,並且給出滿足
的乙個元素
-演算與蘊涵邏輯
先講講-演算。
如果我們定義函式的方法純粹使用上文中的
-抽象的話,我們的程式語言就會變得非常簡單。事實上,我們可以僅用
-抽象與代入,就構建起乙個圖靈完備的程式語言;那實際上就是我們要介紹的itt理論(這個名字以後再解釋吧)的骨架。不過,itt理論通過豐富的型別,以及一些比較好的計算上的性質,更好地發展了
-演算。在後面講church編碼的時候,會更詳細地提到。
而僅僅有函式型別的型別論(稱作簡單型別),對應的邏輯就是蘊涵邏輯。所謂「蘊涵」,指的就是「能推出」的關係。事實上,給一些公理(譬如,題圖中的那些),就可以在蘊涵邏輯的基礎上完全地描述命題邏輯,也就是不涉及比命題更精細的結構。所謂的「邏輯三段論」等等就是命題邏輯的一部分。
如果有時間我再多講講吧。
[1] the univalent foundations program,homotopy type theory: univalent foundations of mathematics.
[2] wikipedia, name resolution (programming languages), alpha renaming to make name resolution trivial.
返回目錄:zhuanlan.zhihu.com
箭頭函式寫法 箭頭函式
1 箭頭函式介紹 es6 let fn v v console.log fn 好酷的箭頭函式!好酷的箭頭函式!es5 let fn function v 和return省略掉 v v v 相當於 function v 和return v 和return時,如果返回的內容是乙個物件,物件需要用括號 括...
箭頭函式寫法 箭頭函式 語法說明
該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓 遞迴函式的改寫 尾遞迴的實現,往往需要改寫遞迴函式,確保最後一步只呼叫自身。做到這一點的方法,就是把所有用到的內部變數改寫成函式的引數。比如上面的例子,階乘函式 factorial 需要用到乙個中間變數total,那就把這個中間變數改寫成函式的引數。這樣...
es6函式寫法差別 箭頭函式
經典練習 常看 老方法定義 var fn function 例如 var add function a,b 或者 function fn 例如 function add a,b 簡寫方法速記 將原函式的 function 關鍵字和函式名都刪掉,並使用 連線引數列表和函式體。function add ...