F#列挙型・判別共用体など、type復習

Haskellを少し勉強すると、
型コンストラクタと、データコンストラクタ を区別した方が理解しやすいように思えてきた。


データコンストラクタは、データを作るもの
型コンストラクタは、こっちは自信ないけど、変数の型を宣言するためのもの。変数の型名という感じか。


F#とScalaを勉強しているが、F#で上のことを意識してみると


〇判別共用体(代数的データ型)
type Shape =

Circle of float
EquilateralTriangle of double
Square of double
Rectangle of double * double


では、Shapeが型コンストラクタで、Circleとか…が、データコンストラクタ。
で、Shape型の変数に、Circleとかで作ったデータが束縛できると。
ちなみにパターンマッチは、Circleとかでよい。


〇レコード
type Car = {
Make : string
Model : string
mutable Odometer : int
}
let myCar = { Make = "Fabrikam"; Model = "Coupe"; Odometer = 108112 }


Carが型コンストラクタで、{ 〜=〜 ; 〜=〜 ; 〜=〜 }、がデータコンストラクタ。
で、パターンマッチは、{ 〜=〜 ; 〜=〜 ; 〜=〜 } でよいよう。


〇 列挙型
type Color =
| Red = 0
| Green = 1
| Blue = 2


では、Colorが型コンストラクタで、Color.Redなどが、データコンストラクタになるよう。
で、Color型の変数に、これらのデータは束縛できると。
ちなみにパターンマッチは、Color.Redなどでマッチする。


type Option<'a> =
| Some of 'a
| None
これも同じ理解でよさそう。


〇 まとめ
・ type宣言の左辺は、型コンストラクタ、右辺がデータコンストラクタ という理解でよさそう。
・ データコンストラクタとパターンマッチは、普通は、同じようにかけそう。
・ あと他に、F#では、OOPのクラスがtypeで定義できますが、上のものは、{ }や | のような記号を使って定義していますが、
クラスは、そういう記号を使わないで定義したもののようです。
http://wiki.livedoor.jp/n7shi/d/F%23#content_1 のサイトがOOPに関しては、一番ユーザ視点の解説のような気がします。


http://msdn.microsoft.com/ja-jp/library/dd233205.aspx
クラス、共用体、レコード、および構造体を使用する状況 のところで使い分けが書いてあった!
あとは、F#を使ったOOPの解説は、http://codezine.jp/article/detail/4600 にあった。