見出し画像

関数型言語のモナド (4)

関数型言語のモナド (3) のプログラム Test1.hs にあった Student や Teacher に、将来なんらかの情報が付加される場合について考えてみましょう。

付加される情報が、String であるのか Int であるのか、はたまた日付のような情報か、現時点では分からない状況であるものとします。

もし、付加される情報が必ず String と決まっているなら、以下のようにすることもできます。

-- 変更前
data SchoolRoster =
    Student String Int Int
    | Teacher String String

-- 変更後
data SchoolRoster =
    Student String Int Int String
    | Teacher String String String

しかし、何が付加されるのか分からない場合、以下のようにします。

-- 型構築子 SchoolRoster の後ろに記号が付加されることに注目してください。
data SchoolRoster a =
    Student String Int Int a
    | Teacher String String a

何が付加されるのか分からないので、とりあえず a と表現しておくのです。 もちろん a を使わずに、b を使っても x を使っても問題ありません。

このように、型構築子 の後ろに何かを書いた場合、それは 型変数 として扱われます。

今は、型変数が1つの場合を書いていますが、型変数は2つあってもいいですし、値構築子ごとに使用する型変数が異なっても構いません。
例えば、以下のように Student の方にのみ情報を付加するようにしても構いません。

-- Teacher の方には 型変数 a を付けないようにすることもできます。
data SchoolRoster a =
    Student String Int Int a
    | Teacher String String

そして、もし付加される情報が Int と決まった場合には、SchoolRoster Int 型と呼ばれることになります。
付加された情報が String と決まれば、SchoolRoster String 型と呼ばれることになります。

この 型変数がモナドにおいて重要な役割を果たすことになる のですが、それは次章で触れることにしましょう。

この記事が気に入ったらサポートをしてみませんか?