Haskell 系统 F 中的绑定运算符,包括种类

Haskell bind operator in System F including kinds

我需要知道 Haskell 绑定类型 (>>=) 运算符的 System F 类型是什么。

到目前为止我是这样写的:

(M::*->* A::*) -> (A::* -> (M::*->* B::*)) -> (M::*->*  B:*)

对吗?如果正确,我如何找到最终结果?

谢谢!

你快到了。为类型变量添加显式量词,并删除每个变量使用的类型注释。

∀M:*->*. ∀A:*. ∀B:*. M A -> (A -> M B) -> M B

我使用了更传统的 : 而不是 Haskell 的 ::

但是请注意,系统 F 没有更高种类(例如 *->*),因此上面的类型只能在更强大的类型系统(例如 System Fω)中找到。

此外,上面我 "conveniently" 省略了对 M 的类型类限制,这使得类型接近但不完全是 >>= 的 Haskell 类型. (另请参阅@DanielWagner 的评论)。

这个不为人知的细节很重要。否则,上面的类型太普遍以至于无人居住——没有 lambda 项具有该类型。实际上,通过矛盾假设 f 具有上述一般类型。那么,

f (λt:*. t->⊥) : ∀A,B:* . (A -> ⊥) -> (A -> B -> ⊥) -> B -> ⊥

其中 ⊥ 是任何空类型(例如 Void,在 Haskell 中)。但是,将 取为任何非空类型(例如 (),在 Haskell 中),其中居民 u,我们得到

f (λt:*. t->⊥) ⊥ : ∀B:* . (⊥ -> ⊥) -> (⊥ -> B -> ⊥) -> B -> ⊥
f (λt:*. t->⊥) ⊥ ⊤ : (⊥ -> ⊥) -> (⊥ -> ⊤ -> ⊥) -> ⊤ -> ⊥
f (λt:*. t->⊥) ⊥ ⊤ (λx:⊥. x) : (⊥ -> ⊤ -> ⊥) -> ⊤ -> ⊥
f (λt:*. t->⊥) ⊥ ⊤ (λx:⊥. x) (λx:⊥. λy:⊤. x) : ⊤ -> ⊥
f (λt:*. t->⊥) ⊥ ⊤ (λx:⊥. x) (λx:⊥. λy:⊤. x) u : ⊥

所以有人居住--矛盾。

更通俗地说,以上仅证明 data T a = T (a -> Void) 不能是 monad。