結(jié)。 / 匹配子 —— Ruby 的類型論,實現(xiàn)參數(shù)多態(tài)和交換律、結(jié)合律(三)

這是一個了斷,
在寫完這篇?匹配子?理論之后,
我不會再去學習和消費?數(shù)學游戲?了。
函數(shù)多態(tài)方式
類似 f :: a, b, c, d, e -> e 這種的
或者 f(a, b, c, d)
f :: a, b, c, d, e -> e 應(yīng)當看成一個整體,也就是一個序列。
(a, b, c, d) 叫 輸入序列。 -> e 叫 返回序列。
為了不混淆,也就可以叫 serie(系列)。
而函數(shù)的類型,等價于匹配序列的一個模式表達式。
函數(shù)類型 (int, int, int) -> int 匹配 (1, 2, 3)。
-> int需要匹配調(diào)用它的函數(shù)的 槽位?的參數(shù)類型。
可以看到,類型——匹配子的對應(yīng)關(guān)系如下:
設(shè):
其中:
- 可以展開成一個樹,被調(diào)用的函數(shù)稱作某函數(shù)的上游函數(shù),調(diào)用函數(shù)的函數(shù)稱作某函數(shù)的下游函數(shù)。
a() 有調(diào)用它的函數(shù)f(),a()稱作f()的 上游函數(shù),而f()稱作a()的 下游函數(shù)。
?g() 沒有調(diào)用者,故,g()稱作該函數(shù)鏈的 根函數(shù)、最終下游函數(shù)。
?a() 沒有上游函數(shù),故,a()稱作該函數(shù)鏈的 頂流函數(shù),或末函數(shù)。
?f() 既有上游又有下游,稱 介函數(shù) 或 間函數(shù)。
- 在 f(...) 中:
-?第一個 a() 匹配下游調(diào)用 f() 的第一個槽位,f() 需要返回值為 int 類型的參數(shù)。于是 a() 調(diào)用了 (->int) 的分支函數(shù)
?。?f() 的第二個參數(shù)槽位 需要 str 類型的參數(shù),于是 a() 調(diào)用了 (->str)
- 在 g(...) 中:
?。?g() 需要 int 類參數(shù),于是 f() 調(diào)用 了返回值為 int 的分支函數(shù)
- 對于a():
?。?第一個a() 匹配下游f()的第一個槽位(int),f() 需要 int 類的參數(shù),因此,a 調(diào)用了(->int) 的分支函數(shù)
-?第二個a() 匹配 f() 的第二槽(str)。因此調(diào)用了(->str) 分支函數(shù)。
- 對于g():
?。?他需要一個 int 類的參數(shù),返回 int 類的值
- 對于f():
?。?他在 g() 的第一個槽位,需要 int 類參數(shù),因此,f() 確定了返回值類型,(...->int)
?。?(...->) 和 (int str->...) 組合一起,就確定了要調(diào)用 (int str -> int) 分支函數(shù)。
更復(fù)雜的情況:
展開成樹后是:
此時,f() 返回值重載和他的下游函數(shù) g() 該槽位的參數(shù)重載同時存在。
a() 和 f() 互有重載沖突。
根本無法確定匹配哪個分支函數(shù)。
此時,為了確保只有一個結(jié)果——函數(shù)類型的確定性,可采取如下 解疊加(消疊加態(tài)) 規(guī)則:
函數(shù)鏈 *全匹配* 原則:將函數(shù)鏈展開成樹,對所有函數(shù)采取完全匹配成功的類型。
先后原則:上述步驟還有多分支,則采取第一個定義的分支函數(shù)。
!!! 如果采取了 先后原則,可能無法實現(xiàn)異步定義。
如,整個函數(shù)鏈只有 a(),根據(jù)先后原則,返回第一個分支函數(shù)—— a :: int。
匹配子、類型、集合的行為類似。

單子 Just()
Just(1) 只匹配 1,故 Just(1) 是一個 單子。
int int 匹配 1 2 也匹配 2 3,故 int int 不是單子,他的 tokens 全由非匹配子組成,他是個 終匹配子。
順序標記
有序匹配子 <int str> 匹配 一個 第一項是int,第二項是str 的序列。
涵序匹配子不關(guān)心序列的順序, [int str] 匹配 int str 和 str int。
因此 [int str] 蘊含 <str int>。

數(shù)量標記
[int str {..3}] 蘊含 <int> 、<int str>、<str int>...<str int str>...等1+2+3+4=10 個終匹配子。
同時也蘊含 <int str{2..3}> 子匹配子。
類型、類集、單子、終匹配子的區(qū)別
本質(zhì)上說,類型和匹配子一樣,可以匹配實例:
匹配子
? ? 結(jié)。