小编mak*_*elc的帖子

转到Haskell:任何人都可以解释这种看似疯狂的持续monad使用效果吗?

这个线程(Control.Monad.Cont fun,2005),Tomasz Zielonka介绍了一个函数(由ThomasJäger以清晰而美观的方式评论).Tomasz接受callCC主体的参数(函数)并返回它以供以后使用,具有以下两个定义:

import Control.Monad.Cont
...
getCC :: MonadCont m => m (m a)
getCC = callCC (\c -> let x = c x in return x)

getCC' :: MonadCont m => a -> m (a, a -> m b)
getCC' x0 = callCC (\c -> let f x = c (x, f) in return (x0, f))
Run Code Online (Sandbox Code Playgroud)

这些也在Haskellwiki中提到过.使用它们,你可以像haskell中的goto语义看起来非常酷:

import Control.Monad.Cont

getCC' :: MonadCont m => a -> m (a, a -> m b)
getCC' x0 = …
Run Code Online (Sandbox Code Playgroud)

continuations haskell monad-transformers

37
推荐指数
2
解决办法
4827
查看次数

如何使用( - >)Monad实例和关于( - >)的混淆

在不同的问题上,我发现了关于使用(->)Monads实例的评论中的提示,例如用于实现无点样式.

至于我,这有点过于抽象.好吧,我已经看到了Arrow实例,在(->)我看来,它(->)可以在实例表示法中使用,但不能在类型声明中使用(这可能只是另一个问题的东西).

有没有任何例子使用(->)Monad的例子?还是一个很好的链接?

很抱歉,如果这个问题可能已经在这里讨论过,但是搜索" (->)Monad实例"会给你很多次点击,因为你可以想象......因为几乎所有关于Haskell的问题都涉及到(->)"Monad".

monads haskell functional-programming pointfree

36
推荐指数
2
解决办法
3114
查看次数

无法获得MonadWriter实例用于连续Monad变压器?

我尝试为Continuation Monad Transformer的MonadWriter创建一个派生实例.这是我尝试的方式:

{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, UndecidableInstances #-}

import Control.Monad.Cont
import Control.Monad.Writer


instance (MonadWriter w m) => MonadWriter w (ContT r m) where
   tell= lift . tell
   listen m= ContT $ \ c -> do
         (a,w) <- listen $ runContT m (c)
         return (a,w)

   pass m = undefined
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误:

Occurs check: cannot construct the infinite type: r = (r, w1)
When generalising the type(s) for `listen'
In the instance declaration for `MonadWriter w (ContT r m)'
Run Code Online (Sandbox Code Playgroud)

接下来尝试是这样的:

instance (MonadWriter …
Run Code Online (Sandbox Code Playgroud)

haskell

8
推荐指数
1
解决办法
802
查看次数