箭頭函式寫法 MLTT 函式型別

2021-10-14 06:36:17 字數 2028 閱讀 4784

函式型別在初中階段就接觸到了:

如果 如何構造這樣乙個型別的元素呢?給定乙個表示式

由這個表示式就可以構造乙個函式

那麼 這裡

是沿襲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 ...