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()