帰納的に構成される型

data Tree a
  = Leaf a
  | Tree (Tree a) (Tree a)

値コンストラクタ、型コンストラクタ、型が紛らわしいという例。値コンストラクタをタグだと考えると:

type Tree<A> =
 @Leaf A | @Tree [Tree<A>, Tree<A>]

タグ @Leaf, @Tree に対応する値コンストラクタを ^Leaf, ^Tree とすると:

  • ^Leaf<A> : A → Tree<A>
  • ^Tree<A> : Tree<A>×Tree<A> → Tree<A>

これで区別できた。

  1. @Tree : タグ
  2. ^Tree : タグが定義する値コンストラクタ写像 ^Tree<A>(s, t) = @Tree [s, t]
  3. Tree : タグ/値コンストラクタで帰納的に定義される型コンストラクタ Tree:Type → Type