ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ScalaコミュのScalaのなんでかな〜 constructor

  • mixiチェック
  • このエントリーをはてなブックマークに追加
Scalaのクラス定義がコンストラクターと一体になっている構文にとまどった方も多い(多くはいないかな?)のではないでしょうか。

私も最初何故このような構文なのかが分かりませんでした。

でも最近このconstructorが関数プログラミングとオブジェクト指向のうまい折衷案のような気がしています。

HaskellやOCamlなどのML系の言語では以下のような構文をよく使います。

def sumList(l:List[int]):int ={
def s(total:int,l:List[int]):int = l match{
case Nil => total;
case hd :: tl => s(total + hd,l);
}
s(0,l);
}

再帰呼び出しを多用するML系の言語ではこのようなNested Functionは必須です。

これをScalaのクラス定義に当てはめると次のようになります。

class Point(x:int,y:int){
def +(d:int) = new Point(x+d,y+d);
override def toString = "x:"+x+" y:"+y;
}

このPointクラスはコンストラクタで渡されたパラメータを「+」メソッド、「toString」メソッド内で直接参照することでimmutableクラスを端的に表すことができます。

immutableはML系の言語が重視している性質です。

こう考えるとScalaではimmutableなクラスが簡単に実現できて、かつ、varを使ってmmutableなクラスもJavaと同じように実現できる。

この緩やかな関数プログラミングの適用もScalaの魅力のような気がしています。

コメント(2)

kanさん
札幌からScalaへの愛のあるメッセージ、ありがとうございます。
わたしは本日は大阪です。

オブジェクト指向は、基本的に oid + 状態 つまり
oidで区別された複数の状態機械がメッセージで交信しあいながら
状態を更新していき、必要な計算を行なっていくモデルですよね。

一方の関数型は、入力の値=オブジェクトに関数を適用して
新たな値=オブジェクトを生成して出力とするという
値のみが問題とされ状態変化は登場しない計算モデルです。

ただScalaの場合は、val 変数に値として代入したオブジェクトは
oidとしてはimmutableとはいえ、その内部状態はmutableなので
完全な参照透明性を確保するのは結構むずかしいかもしれませんね。

いずれにせよ、
オブジェクト指向と関数型という2つアプローチを、
1)適切に使い分ける、2)組み合わせて使う
ための指針を見つけ出す、というのが今後必要ですね。
Ha2さん

札幌近郊の春スキーも終わりに近づいて市内はすっかり春になってます。

私もオブジェクト指向と関数型のデザインパターンにすごく興味があります。
Scalaは関数型なのに末尾再帰よりもfor文をものすごく便利にすることで関数型の敷居を下げているように思いますし、今でもScalaでオブジェクト指向と関数型のデザインパターンがある程度できているような気がします(といっても直ぐには明確にできないですが...)

Scalaをいじりながらその当たりのデザインを思い巡らすのが楽しいです

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Scala 更新情報

Scalaのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング