MonadBaseControl законы

Класс MonadBaseControl предлагает очень мало законов. Чтобы получить то, что я хочу, мне нужно еще одно:

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

Моя чрезвычайно смутная интуиция предполагает, что это естественно (в некотором смысле) и что оно может даже следовать из некоторой комбинации законов Functor, параметричности и документированных законов MonadBaseControl. Это так? Если нет, то есть ли "разумные" случаи, которые не подчиняются закону?

Примечание. Я также задал сокращенную версию этого вопроса как проблему GitHub.

Ответы

Ответ 1

Это непосредственное следствие свободной теоремы типа 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)

Соответствующая литература

В качестве отправной точки для чтения по теме, там, конечно, статья Теоремы бесплатно! Филипом Уодлером, и другой тесно связанной с ним Свободной теоремой, включающей классы конструктора типов Яниса Фойгтландера.