このモナドのチュートリアルを読んでいるときに、次の式を見つけました。
データ M a = 例外を発生させる | 返す
タイプ例外 = 文字列
Raise Exception と Return a で型変数と値の範囲として a が使われているとありますが、ここで M の使い方 (または意味) がわかりません。M がデータ型の場合、なぜ M a のように使用されるのですか?
このモナドのチュートリアルを読んでいるときに、次の式を見つけました。
データ M a = 例外を発生させる | 返す
タイプ例外 = 文字列
Raise Exception と Return a で型変数と値の範囲として a が使われているとありますが、ここで M の使い方 (または意味) がわかりません。M がデータ型の場合、なぜ M a のように使用されるのですか?
値コンストラクターと型コンストラクターを区別する必要があります。
M
はデータ型ではなく、データ型コンストラクターです。したがって、Type のデータ型を構築するには、Type のデータ型を取得するType のデータ型であるM a
Type コンストラクターを指定します。たとえば、データ型または.M
a
M a
M Int
M String
一方Raise
、Return
ここでは値コンストラクターです。したがって、型の値を取得するにはM Int
、値コンストラクターReturn
に TypeInt
のような値を入力するとしますReturn 2
。
これには素晴らしい理論があります。値コンストラクターと型コンストラクターの詳細については、こちらを参照してください。
M
は定義されている型コンストラクターの名前であり、a
このコンストラクターの型パラメーターです。後でデータ型を使用するには、コンストラクターを指定し、M
型引数を指定する必要があります。a
M Int