我試圖瞭解下面這個tutorial的延續。`get`如何在State monad的CPS版本中工作?
然而,我有困難,瞭解在節2.10以下示例:
# let get() =
shift (fun k -> fun state -> k state state) ;;
get : unit => ’a = <fun>
state
是int
我想類型。我沒有得到的是k
的類型。按照我的理解,k
捕獲所有計算get()
後說到後來,因爲我們正在談論的狀態單子,k
是合理的代表,將通過採取int
繼續計算,因此
k : int => 'a
但是從代碼,它似乎並沒有做到這一點,它需要state
第二次,這實際上意味着:
k : int => int => 'a
,但我不明白,其中第二個是從哪裏來的,並在其中檢測get
是請輸入unit => 'a
而不是unit => int => 'a
?
相比於實際狀態單子實現中,混亂增加了更多:
newtype StateT s m a = StateT { runStateT :: s -> m (a,s) }
即狀態轉換表示爲從狀態結果和狀態的元組,其中我的第一理解相匹配的功能。
任何人都可以領先?
其次,我該如何在這裏使用Haskell的Control.Monad.Trans.Cont
來實現get
?我遇到了安慰類型系統的問題。
UPDATE
看來我拿到了第二個:
Prelude Control.Monad.Trans.Cont> let get() = shift $ \k -> return $ \i -> k i i
但我仍然不知道爲什麼我需要兩次運用狀態的延續。
@Bergi它實際上被稱爲OchaCaml。我正在學習教程,但我不認爲使用的語言會影響這種情況下對概念的理解。 – HuStmpHrrr