【发布时间】:2015-07-12 14:04:09
【问题描述】:
a的双重否定的库里-霍华德通讯员是谁; (a -> r) -> r 或 (a -> ⊥) -> ⊥,或两者兼而有之?
这两种类型都可以在 Haskell 中进行如下编码,其中⊥ 编码为forall b. b。
p1 :: forall r. ((a -> r) -> r)
p2 :: (a -> (forall b. b)) -> (forall b. b)
Wadler 2003 的论文以及 implementation in Haskell 似乎采用前者,而有些 其他文献(例如this)似乎支持后者。
我目前的理解是后者是正确的。我很难理解前一种风格,因为您可以使用纯计算从 forall r. ((a -> r) -> r) 创建类型为 a 的值:
> let p1 = ($42) :: forall r. (Int -> r) -> r
> p1 id
42
这似乎与不能从¬¬a 推导出a 的直觉逻辑相矛盾。
那么,我的问题是:p1 和p2 都可以被视为¬¬a 的库里-霍华德通讯员吗?如果是这样,我们可以构造p1 id :: a 的事实如何与直觉逻辑相互作用?
为了方便讨论,我提出了更清晰的双向否定转换编码。感谢@user2407038!
{-# LANGUAGE RankNTypes #-}
to_double_neg :: forall a. a -> (forall r. (a->r)->r)
to_double_neg x = ($x)
from_double_neg :: forall a. (forall r. (a->r)->r) -> a
from_double_neg x = x id
【问题讨论】:
-
⊥ 不是类型。你想要
Void,就像en.wikibooks.org/wiki/Haskell/…一样。 -
@ReinHenrichs,我认为调用空类型⊥一点也不稀奇。它是类型格的“底部”。
-
@dfeuer 你当然是对的。我只是习惯于在价值上下文中看到它。
标签: haskell continuations curry-howard