My開発メモ

Haskellにおける”メッセージ”の意味

『入門Haskellプログラミング』という本を読んでたら、「メッセージ」という言葉が頻繁に出てきた。しかも、独特な使い方をしている。

そこで、整理してみた。

『入門Haskellプログラミング』
p.98 10.1 プロパティが1つのオブジェクト: 1杯のコーヒー

「cupという関数を定義します。この関数は、引数としてコーヒーカップに入っている液体の量を受け取り、その値が格納されたクロージャを返します。」

『入門Haskellプログラミング』p.98
cup flOz = \_ -> flOz

この cup というのがオブジェクトとなる。

flOz が プロパティで、ここでは cup の容量となる。(単位・オンス)

「コーヒーカップの内部にメッセージを適用できるようにしましょう。」

同上
cup flOz = \message -> message flOz

「メッセージをオブジェクトの内部プロパティに適用できるようになります。」

同上

この message というのは メッセージ関数 とでもいうようなもので、引数に cupオブジェクトをもつ。

通常のオブジェクト指向言語だと “ゲッター”、”セッター”のようなイメージだろう。

「オブジェクトにメッセージを送信するために使用しているパターンが、メソッド呼び出しの共通パターンと少し異なることに注意してください。」

同上
共通パターン car.start()

この場合、car がオブジェクト(インスタンス)、start()がメソッド。

Haskellでのやり方は、メッセージをオブジェクトに送信するというもの。

Haskellでのパターン start car

messageの例だと、”message cup” となる。

具体例として、cupオブジェクトを例に考えてみる。

-- オブジェクトcupの定義
cup flOz = \message -> message flOz

以下のように使う。

coffeeCup = cup 12

これで、12というプロパティを持った cupオブジェクトである coffeeCup が定義された。

このプロパティを取得するゲッターメソッドをメッセージ関数として定義する。

getOz aCup = aCup (\flOz -> flOz)

aCup というのは、cupオブジェクトで、coffeeCupオブジェクトに対しておこなうなら、

ghci> getOz coffeeCup
12

となる。

参考

『入門Haskellプログラミング』
Will Kurt 著
株式会社クイープ 監訳
翔泳社
2019年07月31日 初版第1刷

カテゴリー: Haskell, memo

タグ: message, オブジェクト指向, ゲッター, セッター, プロパティ, めっせーじ

カウント: 133