提升内部延续

the*_*tes 7 haskell functional-programming

我有 type 的延续(a -> b) -> b。我还有一个“几乎”适合上下文的函数,类型为Monad m => a -> m b。有没有办法将延续升级(a -> b) -> b(a -> m b) -> m b?我的直觉是不,但我想在这方面是错误的。

chi*_*chi 8

这确实是不可能的,至少在m可以是任意 monad的一般情况下。

假设 monadm是延续 monad (- -> r) -> r。(newtype为清楚起见,我省略了包装器)。

然后,您想要的是一种转换(a -> b) -> b(a -> (b -> r) -> r) -> (b -> r) -> r. 换句话说,你想要一个类型为的多态项

t :: ((a -> b) -> b) -> (a -> (b -> r) -> r) -> (b -> r) -> r
Run Code Online (Sandbox Code Playgroud)

我们证明t不能通过矛盾存在。让我们假设这样一个t存在。我们可以通过选择r~ab~Void(空类型)来专门化它。

t :: ((a -> Void) -> Void) -> (a -> (Void -> a) -> a) -> (Void -> a) -> a
Run Code Online (Sandbox Code Playgroud)

现在,回想一下我们有一个(总共!)函数absurd :: Void -> a(本质上是absurd x = case x of {})。然后我们得到

\ x -> t x (\y _ -> y) absurd
:: ((a -> Void) -> Void) -> a
Run Code Online (Sandbox Code Playgroud)

根据Curry-Howard 同构,以下将是直觉逻辑中的逻辑重言式:

((A -> False) -> False) -> A
Run Code Online (Sandbox Code Playgroud)

但上面的公式是Not (Not A) -> A,即双重否定消除,这在直觉逻辑中是无法证明的。因此,我们得到了一个矛盾,我们必须得出结论,没有t这种类型的术语。

请注意,t其他 monad 可能存在m