haskell中的callcc有什麼用?

時間 2021-05-29 23:14:24

1樓:應用

寫點個人理解:

重點是理解下面這個函式的含義:

gotoCont :: (a -> r) -> a -> Cont r x

gotoCont c a = Cont $ \_ -> c a

Cont $ \_ -> c a 表示不管之後的延續如何定義,直接以引數a,執行c表示的延續。

callCCf=

Cont$\

c->runCont(f

(\a->Cont(\

_->ca

)))c

在callCC f 這個函式中c 代表 callCC f 之後所有的延續函式通過(>>=)形成的乙個整體延續函式。

所以當你呼叫c 的時候就相當於goto到了callCC f 後的整體延續函式。

fact_cps2

::Int

->Cont

rInt

fact_cps2n=

do(goto

,acc

,num

)<-callCC$\

k->letfxy

=k(f

,x,y

)inreturn(f

,1,n

)ifnum==

1then

return

accelse

goto

(acc

*num)(

num-1)

-- haskell函式式程式設計入門第2版例子

2樓:馮東

這個東西叫 first-class continuation。Continuation 是任何 runtime 都有的,說白了就是 callstack + instruction_point。First-class 就是做到這個東西能顯式的存到變數裡(FP 叫繫結到 name 上),當引數傳遞或者作為返回值。

其實沒什麼大用。這個東西理論上可以模擬一切 control flow。但是 Lisp 界已經公認用 continuation 來模擬普通的東西(比如 exception, return, coroutine)代價太高。

就拿複雜度僅次於 first-class continuation 的 coroutine 來說,coroutine 可以在不同 continuation 中挑換,但是每個 continuation 不能儲存下來重新使用,就是每個 continuation 只能用一次(也就是每個計算只能 go forward)。

至於這個東西和尾呼叫沒什麼直接聯絡。尾呼叫用 goto 就能完成。Objective-C 的 objMsg_send 就是尾呼叫優化。

3樓:何幻

它是語言實現尾呼叫優化後的必然結果。

如果乙個函式是尾呼叫,那麼這個函式就應該直接返回到呼叫者該返回的位置。

也就是說,這個函式的continuation就應該是呼叫者的continuation。

這會導致語言實現方式的改變,函式的呼叫不再是乙個棧型結構,而是乙個樹/圖。

至於用call/cc可以實現的非區域性跳轉,比如try-catch或協程等,只是幾種特殊應用罷了。

另外Scheme的強大之處在於continuation是first-class的,其他語言未必這麼爽。

參考:Compiling with Continuations (豆瓣)

Essentials of Programming Languages (豆瓣)

The Scheme Programming Language, 4th Edition

An Introduction to Scheme and its Implementation

Concepts in Programming Languages (豆瓣)

Lisp in Small Pieces (豆瓣)

haskell中的immutable array是如何實現隨機訪問的?

已登出 我印象中 Data.Vector 是乙個 32 個格仔然後可以往下擴充套件的乙個樹,Date.Vector.Mutate 是乙個利用定長陣列實現的 ST Monad 憑印象回答,很可能有錯 Tang Boyun 已經有答案給出Haskell常用的幾個庫,但如果追求極致效能的話,C陣列依舊是最...

如何解釋 Lisp 中 call cc 的概念?

簡單點的理解就是在 call cc 出現的地方搞出乙個蟲洞的出口,而蟲洞的入口是 call cc lambda k中出現的 k 通過 k 的形式將.的求值結果傳送到蟲洞出口的位置,k這個蟲洞入口還可以賦值給別的變數.其它的就交給別的答主了 勃珍妮 補充一下 紅日照小池 池哥的回答,因為看不大懂.定義...

如何理解Haskell中的函式呼叫

並不是你想的語法糖,按照你的思路,只返回的函式咋辦?事實是這是一種叫柯里化的東西,用必應會谷歌自行查詢 Currying Function 事實上,對於Haskell 很多地方與一般的面相過程與物件的語言是不一樣的。 UWRF 對於 a b 是函式嗎?a 和 b 是什麼不重要,但 a 和 b 的型別...