为什么`效果'只能密封两个流入,而不是所有的流量?

xzh*_*zhu 7 haskell haskell-pipes

这是包Effect的官方教程中提供的图表pipes.

 type Effect = Proxy X () () X

  Upstream | Downstream
     +---------+
     |         |
 X  <==       <== ()
     |         |
 () ==>       ==> X
     |    |    |
     +----|----+
          v
          r
Run Code Online (Sandbox Code Playgroud)

由于Effect没有任何数据流,我期待它只是Proxy X X X X,密封所有流量.但相反,它允许两个流入.这有什么特别的原因吗?如果我只是Effect通过签名来编写通常所做的事情Proxy X X X X,它可以完美地传递编译器:

myMonad :: Proxy X X X X IO ()
myMonad = do
    a <- lift $ getLine
    lift $ print a
    return ()
Run Code Online (Sandbox Code Playgroud)

为什么我们不能run这样呢?

Cac*_*tus 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
Run Code Online (Sandbox Code Playgroud)