型別推導時應該怎樣處理call cc

時間 2022-01-13 10:16:11

1樓:Belleve

我建議你去看看 Lambda-Mu 或者 Pure Type System 的文章,因為你的問題已經涉及經典邏輯了。另:call/cc 本體的型別是

2樓:Yunfei Lu

更新,重新組織一下語言。

先說答案。call/cc不是只有一種返回型別。兩種用法對應兩種不同型別。

在第二種情況下process 直接返回k,但其實程式中call/cc 前後通常會有個let、set!或者其他賦值函式,將這個continuation儲存到某個變數x,程式後面會呼叫(x a)的形式。對於(x a)或者之前的(continuation a),都回到了(T1 -> T2) -> T1 -> T2的套路上,程式最終執行完時兩種情況殊途同歸。

在我看來,call/cc更接近於巨集而非函式,往往純用於結構跳轉而非求值,例如call/cc (lambda (k) (if(something) (k #t)))...)這種用法。它的精華放在(k #t)以外的地方,控制執行還是跳轉。

還有,scheme本來就是動態型別系統,型別可以任意的變,分析起來非常痛苦。若當作巨集來看就順眼多了,(...call/cc ...

)這個括號裡的內容整體用k乙個符號代替。然後無論哪種用法,遇到k a或k b時,從整個程式中挖掉call/cc括號內容後,a或b代入k所在位置就能得到結果。

最後舉個例子:

(let* ((yin ( (lambda (foo) (display "@") foo) (call/cc (lambda (bar) bar))))

(yang ( (lambda (foo) (display "*") foo) (call/cc (lambda (bar) bar)))))

(yin yang))

第乙個continuation縮記為k1,(let (yin (lambda (foo) . foo)) k1)...,call/cc...由k1代替了。

第二個continuation縮記為k2,(let (yang (lambda (foo) . foo)) k2)...,call/cc...由k2代替了。

(yin yang)呼叫,就是(k1 k2)

那就變成了

(let (yin (lambda (foo) . foo)) k2) ...(yin yang),k2展開為:

(let (yang (lambda (foo) . foo)) k3) ...,

該展開式代入k2位置,因為k2中yin為k1,執行到(yin yang)變成了(k1 k3)。(k1 k3)變為

(let (yin (lambda (foo) . foo)) k3) ...(yin yang), yin賦值為k3,yang賦值為新k4,(yin yang)為(k3 k4).

k3中,yin是k2, 變成(let (yang (lambda (foo) . foo)) k4) ...,(yin yang)變成了(k2 k4)

k2中,yin是k1, (let (yang (lambda (foo) . foo)) k4) ...,(yin yang)變成了(k1 k4)

(let (yin (lambda (foo) . foo)) k4) ...(yin yang)...成為(k4 k5)

無窮展開.

建議參考

律師處理案件時,應該注重過程還是應該注重結果?

凌徵虎律師 都應該注重,但對當事人一般更在乎結果,所以保證過程的同時爭取好的結果。如果結果不好,過程也不好,這是最壞的 如果結果不好,過程相對做的好,這是居中,當事人相對理解 最好的當然是過程好,結果也好。 月半月巴 說的就好像律師能控制案件結果一樣,大部分當事人都是結果導向的。如果案件結果好,事前...

裝修時飄窗怎樣處理更實用?

裝小蜜家裝監理 飄窗可以設計成休閒空間,放置乙個小圓桌和兩把小椅子喝茶,看書都是比較好的,還可以設計成榻榻公尺又能儲物又能休息,還可以利用飄窗平台種花,擺放裝飾品美觀又實用。底下空間足夠還可以做個小櫃子,檯面使用人造大理石,也不會影響採光。 已重置 臥室飄窗怎麼設計比較好?相信很多人都很關注這樣的問...

英國碩士申請,應該考什麼型別的雅思,申請時需要提交雅思的學校有哪些?

留學文書 Rachel 如果你要申的是英國愛丁堡大學商學院 曼徹斯特大學的商學院 口譯專業 英國和香港的熱門專業,那麼你就需要在申請前就把雅思考好。首先,愛丁堡和曼大的商科如果達不到審理門檻,前者會壓著不審,後者會直接拒信。其實曼大除商學院課程外,還有以下幾個專業在申請時就需要提供總 分7.0 寫作...