7

下面是packageEffect官方教程中提供的示意图。pipes

 type Effect = Proxy X () () X

  Upstream | Downstream
     +---------+
     |         |
 X  <==       <== ()
     |         |
 () ==>       ==> X
     |    |    |
     +----|----+
          v
          r

由于Effect没有任何数据流,我希望它只是Proxy X X X X,密封所有流。但相反,它允许两个流入。有什么特别的原因吗?如果我只是写 aEffect通常做的事情,使用 signature Proxy X X X X,它可以很好地通过编译器:

myMonad :: Proxy X X X X IO ()
myMonad = do
    a <- lift $ getLine
    lift $ print a
    return ()

为什么我们不能run这样?

4

1 回答 1

1

可以从您的示例中运行myMonad,只需采用现有定义runEffect并对其类型进行一些概括:

import Pipes (lift)
import Pipes.Core (closed)
import Pipes.Internal

type Effect' a b = Proxy X a b X

-- Definition copied straight from Pipes.Core, type generalized to Effect'
runEffect' :: Monad m => Effect' a b m r -> m r
runEffect' = go
  where
    go p = case p of
        Request v _ -> closed v
        Respond v _ -> closed v
        M       m   -> m >>= go
        Pure    r   -> return r

eff :: Effect' X X IO ()
eff = do
    a <- lift $ getLine
    lift $ print a
    return ()

main :: IO ()
main = runEffect' eff
于 2015-10-23T02:21:56.743 回答