从这个线程(Control.Monad.Cont fun,2005),Tomasz Zielonka介绍了一个函数(托马斯·耶格(ThomasJäger)以一种清晰而美好的方式进行了评论)。 Tomasz接受一个callCC主体的参数(一个函数),并将其返回给以后使用的两个定义: import Control.Monad.Cont … getCC :: MonadCont m => m (ma) getCC = callCC (\c -> let x = cx in return x) getCC' :: MonadCont m => a -> m (a, a -> mb) getCC' x0 = callCC (\c -> let fx = c (x, f) in return (x0, f)) Haskellwiki也提到了这些 […]
我一直和The Little Schemer一起学习Scheme,并使用PLT-Scheme来处理我的环境。 小Schemer帮助我很大程度上recursion(现在对我来说很简单),但是我被卡在介绍“collections家”的书的一部分,并且把整个函数作为一个整体继续。 这里是他们使用的示例代码。 我理解recursion元素,但我卡住了,特别是在lambda函数 – 我的头脑不能遵循path,如何设置该lambda函数的参数(因为他们唯一的调用是再次调用它们recursion,有在function体内没有具体的使用)。 如果有人能够或多或less地通过将函数recursion到lambda收集器中来计算我的计算path,那可能对我有帮助。 ;; Build a nested list of even numbers by removing the odd ones from its ;; argument and simultaneously multiply the even numbers and sum the odd ;; numbers that occur in its argument. (define (even-only-collector l col) (cond ((null? l) (col (quote ()) 1 0)) […]
这是Cont monad的定义: newtype Cont ra = Cont { runCont :: (a -> r) -> r } instance Monad (Cont r) where return a = Cont ($ a) m >>= k = Cont $ \c -> runCont m $ \a -> runCont (ka) c 你能解释一下为什么这个工作原理? 它在做什么?