gpt4 book ai didi

haskell - 如何在 Haskell 中将 IO 添加到我自己的 monad?

转载 作者:行者123 更新时间:2023-12-04 18:49:58 25 4
gpt4 key购买 nike

我是 Haskell 的新手。我编写了自己的 monad,它是带有错误处理的 State monad:

newtype MyMonad a = MyMonad (State -> Either MyError (State, a))

我在一种小语言的解释器中使用它。现在我想在我的语言中添加一些 IO 操作(读/写),但我不知道如何将 IO monad 包含在我的语言中。我知道我可以结合 ErrorT、StateT、IO 并实现这个结果,但是没有它们还有其他方法吗?

最佳答案

你可以看看StateT实现:

newtype StateT s m a = StateT { runStateT :: s -> m (a,s) }

将状态与 IO 结合起来你只是把 IO代替 m并获得所需的类型: s -> IO (a,s) .

如果你也有错误,这会变成 s -> IO (Either e (a, s))s -> IO (Either e a, s)取决于您是否希望失败的计算影响状态。

请注意,您不能制作 s -> Either e (IO (a, s))没有时间机器的单子(monad)。

更新

事实证明,即使使用时间机器,您也无法使其成为单子(monad)。

为了说明为什么这是不可能的,让我们使用 () 来简化我们的 monad。而不是 s第一: data M e a = M { runM :: Either e (IO a) }
现在,想象一下下面的程序:
unsafePerformIO :: IO a -> a
unsafePerformIO io = fromLeft $ runM $ do
a <- M $ Right $ io
M $ Left a

显然,这个函数是不可能的,因此 M 的 monad 实例也是不可能的。

时间机器能给你的是治疗的能力 IO一模一样的款待 State .但是,我没有意识到 Either e (s -> (a, s))不是单子(monad)。

关于haskell - 如何在 Haskell 中将 IO 添加到我自己的 monad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7442974/

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