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>
これで区別できた。
- @Tree : タグ
- ^Tree : タグが定義する値コンストラクタ写像 ^Tree<A>(s, t) = @Tree [s, t]
- Tree : タグ/値コンストラクタで帰納的に定義される型コンストラクタ Tree:Type → Type