作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Haskell 的新手。我编写了自己的 monad,它是带有错误处理的 State monad:
newtype MyMonad a = MyMonad (State -> Either MyError (State, a))
最佳答案
你可以看看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。而不是
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/
我是一名优秀的程序员,十分优秀!