MonadBaseControl
class提供的法律很少。要获得something I want,我还需要一个:
forall f q. f <$> liftBaseWith q
= liftBaseWith $ \runInBase -> fmap f (q runInBase)
我非常模糊的直觉表明,这是自然的(在某种意义上),甚至可能来自Functor
法则,参数化和已记录的MonadBaseControl
法则的某种组合。是这样吗如果不是,是否有任何违反法律的“合理”实例?
注意:我还问过这个问题的缩写版本as a GitHub issue。
答案 0 :(得分:8)
这是liftBaseWith
类型的自由定理的直接结果。
足以生成此类自由定理版本的“自由定理定理”的简化版本是:
任何f :: forall a. F a -> G a
,F
和任何函数G
的函数a
,其中b
和phi :: a -> b
是函子,满足,
fmap phi . f = f . fmap phi -- simplified "free theorem" for f
(换句话说,该等式只要进行类型检查就成立。)
我没有立即可用的证明,但是如果有反例,我会感到非常惊讶。
在这种情况下,f
是liftBaseWith
,其中的函子是
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密切相关。
>