使用底层类型 Nothing 编码双重否定背后的直觉

Intuition behind encoding double negation with bottom type Nothing

像这样无形编码double negation

type ¬[T] = T => Nothing
type ¬¬[T] = ¬[¬[T]]

(T => Nothing) => Nothing

英里 explains

...the bottom type (Scala’s Nothing type) maps to logical falsehood... negation of a type A (I’ll write it as ¬[A]) to have as it's values everything which isn’t an instance of A

Nothing也用来表示non-termination,即不能产生值的计算

def f[T](x: T): Nothing = f(x)

把这个解释套用在(T => Nothing) => Nothing上,好像意思是:

(          T                   =>                Nothing           )    =>          Nothing 
Assuming a value of type T,   then   the program does not terminate,   hence  it never produces a value.

这种直觉是正确的吗?虚假和非终止的概念是否等同?如果是这样,为什么有一个不产生值的程序,不产生值,意味着我们有一个值T?

If so, why having a program that does not produce a value, which does not produce a value, means we have a value of T?

事实并非如此。 Curry–Howard correspondence is not classical but intuitionistic. There is no law of excluded middle T ∨ ¬T (但存在排中律的双重否定)产生的逻辑。

¬¬T 不等同于 T

T => ¬¬T 但不是 ¬¬T => T.

Are concepts of falsehood and non-termination equivalent?

没有。通常忽略非终止。根据 Curry–Howard 对应关系,当相应类型有人居住时(即存在该类型的值(没有自由变量的术语)),声明为真,当该类型无人居住时,声明为假。

Nothing(或底式)无人居住(对应false)。如果 T 是有人居住的,那么 T => Nothing 是无人居住的(否则 Nothing 是有人居住的)。如果 T => Nothing 有人居住,那么 T 就没有人居住(同样,否则 Nothing 会有人居住)。这就是定义 ¬T = T => Nothing.

的原因

当考虑非终止时,这意味着每个类型 T 被提升为类型 T'T 和底值 的元素组成(divergence,不要与底部类型混淆)。