【发布时间】:2012-09-17 08:56:49
【问题描述】:
假设我们有一个单子,由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 表示?
- 这种表示是唯一的吗(我猜不是)?
- 如果它不是唯一的,是否总是有最“简单”的(例如
→s 的数量:))?
【问题讨论】:
-
我的脑子跑了,你吓到了。
-
一般来说,任何类型的
a都等价于(forall r. (a -> r) -> r)。但这不是很有趣。
标签: haskell continuations continuation-passing