ようこそ。睡眠不足なプログラマのチラ裏です。

Haskellのお勉強 その17

type宣言

type宣言を使うと型に別名をつけることが出来る。例えば、

type FilePath = String

と書くことで、String型の別名としてFilePath型が使えるようになる。
type宣言は型に別名をつけるだけで、型を作る方法が増えるわけではない。
つまり、新しいデータコンストラクタは導入されない。
また、type宣言でも型変数を使った宣言ができる。例えば、

type MyList a = [a]

と書くことで、[a]型の別名としてMyList型を宣言することができる。


newtype宣言

某機動戦士のアレを想起するが、アレのことではない。
newtype宣言を使うと、既存の型をもとにして新しい型を宣言することができる。例えば、

newtype StackNT a = MkStackNT [a]

このように書くと、[a]型を元にStackNT a型を宣言し、
そのデータコンストラクタはMkStackNTである、と宣言していることになる。
newtype宣言がtype宣言と違うのは、型を作る方法が増えるという点。
つまり、新しいデータコンストラクタが導入されることである。
実は、newtype宣言は、同じことをdata宣言でも表現することができる。

data StackNT a = MkStackNT [a]

と表現することができる。ただし、newtype宣言はあくまで既存の型をもとに
新しい型を宣言するので、データコンストラクタのフィールドは1つに制限される。
そのため、複数フィールドがあるようなデータコンストラクタを持つdata宣言を
newtype宣言で書くことはできない。