, , ; , Rémy ⟨-, -⟩, M N ( x₁ x₂) (α₁ α₂); - ⟨M, N⟩ β y, Selinger α f.
, , . ∀, Λ, → λ Haskell. , ∀ Λ , → λ . Haskell-land ,
System F Haskell
Terms (e) : Types (t) Terms (e) :: Types (t)
────────────────────────────────────────────────────────────────
λx:t₁.(e:t₂) : t₁ → t₂ \x::t₁.(e::t₂) :: t₁ -> t₂
Λα.(e:t) : ∀α.t (e::t) :: forall α. t
: → ->, λ \. ∀ Λ?
Haskell ∀s . , ( ), . ,
id :: a -> a
id: ∀α.α → α
System F. ExplicitForAll :
{-# LANGUAGE ExplicitForAll #-}
id :: forall a. a -> a
, , Haskell ; , System F- forall . RankNTypes. , Haskell
{-
( .)
, , ×. Haskell **, ( ×, ).
A × B = ∀α. (A → B → α) → α
Haskell
type a ** b = forall α. (a -> b -> α) -> α
,
pair :: a -> b -> a ** b
pair x y f = f x y
Λs? F ⟨M, N⟩, pair !
, : Haskell Λs , , . , , , . , , Haskell forall System F ∀, Λ System F.
, ()
proj₁ = Λα.Λβ.λp: α × β.p α (λx: α.λy: β.x)
Haskell, Λs ( eliding type),
proj₁ = \p. p (\x y -> x)
proj₁ p = p (\x _ -> x)
F
proj₁: ∀α.∀β. α × β → α
,
proj₁: ∀α.∀β. (∀γ. Α → β → γ) → α
, Haskell
proj₁ :: α ** β -> α
proj₁ :: (forall γ. α -> β -> γ) -> α
, α β ,
proj₁ :: forall α β. (forall γ. α -> β -> γ) -> α
proj₂: ∀α.∀β. α × β → β
proj₂ = Λα.Λβ.λp: α × β.p β (λx: α.λy: β.y)
proj₂ :: α ** β -> β
proj₂ p = p (\_ y -> y)
, , : -)
¹ , Λs Haskell!
² , Λs, , . :
id :: a -> a
id x = x :: a
,
id :: forall a. a -> a
id x = x :: forall b. b
, , . , ScopedTypeVariables; , forall, . , ,
id :: forall a. a -> a
id x = x :: a
.