continuations

    6熱度

    1回答

    我正在做一個項目,需要我寫一個小型的解釋器。這些指令具有簡單的樹形結構,其中一個命令具有暫停執行的效果。所以在下面的例子中,「baz」從不打印。 import Control.Monad.Cont data Instruction = Print String | Halt | Block [Instruction] deriving (Eq, Show) instruction

    0熱度

    1回答

    我有一個應用程序被配置爲捕獲任何在app.config中ThrowUnobservedTaskExceptions enabled =「true」的未觀測任務異常。 我有一個庫類(Class1)需要在它的構造函數中啓動一個異步任務,但是在某些引發異常的場景中,當Class1的實例被丟棄時我進入UnobservedTaskException錯誤(因爲那個任務永遠不會期待已久的)。 我解決了這個問題,

    3熱度

    1回答

    我是still試圖實現2-3根手指樹,我取得了很好的進展(repository)。在做一些基準測試時,我發現當樹很大時,我的基本toList結果爲StackOverflowException。起初,我看到一個簡單的修復,並使其成爲尾遞歸。 不幸的是,事實證明,toList是不是罪魁禍首,但viewr是: /// Return both the right-most element and the

    6熱度

    1回答

    我要去了延續和我遇到兩種不同的方法來構造延續類型: newtype C r a = C {runC :: (a -> r) -> r} exampleFunction :: String -> C Bool String exampleFunction s = C $ \t -> if length s > 10 then t s else False continuationFunct

    1熱度

    1回答

    我通過this指南運行實現併發,我無法理解這個單子實例: data Action m = Atom (m (Action m)) | Fork (Action m) (Action m) | Stop newtype C m a = C {apply :: (a -> Action m) -> Action m} instance Monad (C m) where m >>= f

    0熱度

    2回答

    我有一個很簡單的後續函數(使用簡單起見單子避免): data C a = C {unwrap :: (a -> a) -> a} 本質上講,我試圖執行根據輸入類型不同實施方式中,類似於(須藤代碼)的東西: data Gadt a where AString :: String -> Gadt Bool AInt :: Int -> Gadt Bool data C a

    4熱度

    1回答

    這是展平二叉查找樹的一種方法。它的問題是當它構建的大函數最終應用於[]時,堆棧溢出。我想知道是否有合理的方法修復這段代碼片段而不完全改變它的工作方式。例如,如果構建一個自定義作曲家來構建一個函數樹,然後使用一個顯式堆棧來評估它們(因爲問題已經是將一棵樹展平了),那麼這將無濟於事。 let flatten_k t = let rec f t (k:(list<'a>->list<'a>)

    5熱度

    1回答

    我試圖瞭解下面這個tutorial的延續。 然而,我有困難,瞭解在節2.10以下示例: # let get() = shift (fun k -> fun state -> k state state) ;; get : unit => ’a = <fun> state是int我想類型。我沒有得到的是k的類型。按照我的理解,k捕獲所有計算get()後說到後來,因爲我們正在談論的狀態

    3熱度

    1回答

    在閱讀了幾乎所有關於continuation的內容後,我仍然無法理解它們。也許是因爲所有的解釋都與lambda微積分密切相關,這是我無法理解的。 一般而言,繼續是表示在完成當前事件(即計算的其餘部分)後要執行的操作。 但隨後,它變得棘手,所有變化。也許你們中的一些人可以用我的習慣比喻來幫助我,並指出我在理解中犯了什麼錯誤。 比方說,我們的功能表示爲對象,併爲簡單起見: 我們的翻譯有函數調用堆棧。

    7熱度

    1回答

    我試圖總結我的周圍連拍和callCC頭: s0 = (flip runContT) return $ do (k, n) <- callCC $ \k -> let f x = k (f, x) in return (f, 0) lift $ print n if n < 3 then k (n+1) >> return()