PS

Existential types

@Deprecated

Existential types

(集合論の)Unionは、

  • \bigcup\limits_{x} F(x) = \left{p | \exists x, p \in F(x) \right}

という定義だったが、型理論においては、このような型は作れず

という感じの定義(disjoint union)になっている。 x をどこかから探してくれたりはしない。 Scalaでは、(disjointでない)union風の定義になっており、一般には  x を取り出せない。

Curry–Howard correspondence, カリー=ハワード同型対応

記号論理の命題として

  •  \forall x(F(x) \Rightarrow A) \Leftrightarrow  (\exists xF(x)) \Rightarrow A

が成立するが、記号を型間のものに変えてしまって

  •  \forall\limits_x(F(x) \rightarrow A) \simeq (\exists\limits_x F(x) ) \rightarrow A

としても成立する。このような対応をCurry–Howard correspondenceという(と思う)。

特にこの場合、

  •  f \in \forall\limits_x(F(x) \rightarrow A)

について、

  •  \tilde{f}(x, p) = f(x)(p)

とすればよい。

Haskellのexistential types

Haskellにはexistsはなくて、上の命題を使ってforallで表現する(らしい)。たとえば

data T = forall a. MkT a

について

  •  \text{MkT :: forall $a$}. a \rightarrow T
    •  \sim \text{MkT} \in \forall\limits_{a \in \mathbb{*}} (a \rightarrow T)
    •  \Leftrightarrow \text{\tilde{MkT}} \in (\exists\limits_{a \in \mathbb{*}} a) \rightarrow T

Top type

全てのtermを含む型:

  •   \bigcup \mathbb{*} = \exists \mathbb{*} = \exists\limits_{a \in \mathbb{*}} a

top typeといい

  •  \top

と書く。ScalaでいうところのAnyである。

参考文献

*1:disjointでないとCurry-Howardが成立しないようだ