作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
MonadTrans
文件说:
Each monad transformer also comes with an operation runXXX to unwrap the transformer, exposing a computation of the inner monad.
MonadTrans
未定义为
class MonadTrans t where
type p :: *
type r :: * -> *
lift:: Monad m => m a -> t m a
run :: t m a -> p -> m (r a)
最佳答案
没有用于运行 monad 转换器的通用接口(interface)。例如,尝试运行 LogicT
或 ContT
或 FreeT
使用您的界面。
即使您可以概括您的界面来处理所有这些示例,您仍然会缺少关键要素:法律。类型类方法应该遵循允许您推理使用类型类接口(interface)的代码而无需咨询特定实例的来源的等式。例如,lift
来自 MonadTrans
的方法必须遵守这些法律:
lift (return x) = return x
lift (m >>= f) = lift m >>= \x -> lift (f x)
lift
有很好的理论原因应该遵守这些法则,如果你以这种无点风格编写法则,这些法则会变得更加明显:
(lift .) return = return -- fmap id = id
(lift .) (f >=> g) = (lift .) f >=> (lift .) g -- fmap (f . g) = fmap f . fmap g
(lift .)
是两个 kleisli 类别和
lift
之间的仿函数因此是一个单子(monad)态射。
Functor
,
Monad
, 和
MonadTrans
,以及
Typeclassopedia是开始了解有关此主题的更多信息的好地方。
关于haskell - 为什么 runXXX 不是 MonadTrans 定义的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24749415/
MonadTrans文件说: Each monad transformer also comes with an operation runXXX to unwrap the transformer,
我是一名优秀的程序员,十分优秀!