Предположим, что у нас есть монада, определяемая return
, (>>=)
и набором законов. Существует тип данных
newtype C m a = C { unC ∷ forall r. (a → m r) → m r }
также известный как Codensity. C m a ≅ m a
, учитывая, что m
является Monad
, т.е. мы можем написать две функции to ∷ Monad m ⇒ m a → C m a
и from ∷ Monad m ⇒ C m a → m a
to ∷ Monad m ⇒ m a → C m a
to t = C $ \f → t >>= f
from ∷ Monad m ⇒ C m a → m a
from = ($ return) . unC
и покажите, что to ∘ from ≡ id
и from ∘ to ≡ id
с помощью эквациональных рассуждений, например:
from . to = -- by definition of `(.)'
\x → from (to x) = -- by definition of `to'
\x → from (C $ \f → x >>= f) = -- by definition of `from'
\x → ($ return) (unC (C $ \f → x >>= f)) = -- unC . C ≡ id
\x → ($ return) (\f → x >>= f) = -- β-reduce
\x → x >>= return = -- right identity law
\x → x = -- by definition of `id'
id
Пока все хорошо. Мои вопросы
- Учитывая тип и совокупность законов, как мы построим соответствующее изоморфное представление CPS?
- Является ли это представление уникальным (я бы предположил, нет)?
- Если это не уникально, всегда есть самый "простой" (в числе
→
например:)) один?