Оператор связывания Haskell в системе F, включая виды
Мне нужно знать, что такое тип System F оператора связывания типа Haskell (>>=).
До сих пор я писал это так:
(M::*->* A::*) -> (A::* -> (M::*->* B::*)) -> (M::*->* B:*)
Это правильно? Если это правильно, как мне найти окончательный результат?
Спасибо!
1 ответ
Ты почти там. Добавьте явные квантификаторы для переменных типа и удалите аннотации типов при каждом использовании переменной.
∀M:*->*. ∀A:*. ∀B:*. M A -> (A -> M B) -> M B
Я использовал более обычный :
вместо Хаскелла ::
,
Обратите внимание, что система F не имеет высших видов (например, *->*
), поэтому тип выше может быть найден только в более мощных системах типов (например, система Fω).
Кроме того, выше я "удобно" пропустил ограничение класса типов на M
, что делает тип близким, но не совсем, типом Haskell >>=
, (Также см. Комментарий ниже @DanielWagner).
Эта мелкая деталь важна. В противном случае приведенный выше тип является настолько общим, что он не заселен - ни один лямбда-термин не имеет такого типа. Действительно, предположим, что противоречие есть f
имеющий общий тип выше. Затем,
f (λt:*. t->⊥) : ∀A,B:* . (A -> ⊥) -> (A -> B -> ⊥) -> B -> ⊥
где ⊥ - любой пустой тип (например, Void
в Хаскеле). Но тогда, принимая ⊤
быть любого непустого типа (например, ()
в Хаскеле с жителем 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)
не может быть монадой.