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
这样呢?
您可以从您的示例中运行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)
归档时间: |
|
查看次数: |
97 次 |
最近记录: |