Ответ 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)
Соответствующая литература
В качестве отправной точки для чтения по теме, там, конечно, статья Теоремы бесплатно! Филипом Уодлером, и другой тесно связанной с ним Свободной теоремой, включающей классы конструктора типов Яниса Фойгтландера.