gpt4 book ai didi

haskell - 为什么 `Effect` 只密封两个流入,而不是所有流?

转载 作者:行者123 更新时间:2023-12-04 12:53:13 30 4
gpt4 key购买 nike

这是Effect的示意图pipes官方教程中提供包裹。

 type Effect = Proxy X () () X

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

由于 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像这样的东西?

最佳答案

可以运行 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

关于haskell - 为什么 `Effect` 只密封两个流入,而不是所有流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33269870/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com