MonadBaseControl法则

时间:2019-09-25 19:58:17

标签: haskell

MonadBaseControl class提供的法律很少。要获得something I want,我还需要一个:

forall f q. f <$> liftBaseWith q
  = liftBaseWith $ \runInBase -> fmap f (q runInBase)

我非常模糊的直觉表明,这是自然的(在某种意义上),甚至可能来自Functor法则,参数化和已记录的MonadBaseControl法则的某种组合。是这样吗如果不是,是否有任何违反法律的“合理”实例?

注意:我还问过这个问题的缩写版本as a GitHub issue

1 个答案:

答案 0 :(得分:8)

这是liftBaseWith类型的自由定理的直接结果。

足以生成此类自由定理版本的“自由定理定理”的简化版本是:

任何f :: forall a. F a -> G aF和任何函数G的函数a,其中bphi :: a -> b是函子,满足,

fmap phi . f = f . fmap phi  -- simplified "free theorem" for f

(换句话说,该等式只要进行类型检查就成立。)

我没有立即可用的证明,但是如果有反例,我会感到非常惊讶。

应用程序

在这种情况下,fliftBaseWith,其中的函子是

F a = RunInBase m b -> b a  -- F = ReaderT (RunInBase m b) b
G a = m a

将上述“自由定理”的两边应用于q,为fmap展开ReaderT的定义:

(fmap phi . liftBaseWith) q = (liftBaseWith . fmap phi) q
fmap phi (liftBaseWith q) = liftBaseWith (fmap phi q)
fmap phi (liftBaseWith q) = liftBaseWith \run -> fmap phi (q run)

相关文献

作为阅读该主题的起点,当然有Philip Wadler的论文免费定理!,以及Janis Voigtlander的另一本Free theorems involving type constructor classes密切相关。

>