kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

Scalaに関して知っておくべきたった一つの重要な事

タイトルは釣りです。先日、大昔に見た懐かしい記事翻訳されていました。この記事自体ははっきり言って、ScalaはOCamlではないということを言葉を変えて延々と言ってるだけなので、どーでもいいです。3年も前の英語記事がTwitter上で今更注目された事に驚きです。

さて、本題に入りましょう。元記事の言っている事はおいておいて、Scalaの核言語は(若干風変わりな)クラスベースのオブジェクトシステムであるという事は、頭の片隅においておくと良いと思います。Scalaの関数型プログラミングサポートの多くは、関数型言語に見られる機能をオブジェクト指向的に再解釈して取り込んだものであり、中心にあるのはあくまでオブジェクトです。

(追記) 核言語(core language)という言葉に馴染みが無い方も居ると思うので、説明を追加します。核言語という考え方は、プログラミング言語を、まさにその核である核言語とそれ以外に分け、核言語以外の構成要素を核言語への変換として定義するというものです。このように言語を定義することによって、言語を成長させつつ、仕様が際限なく肥大化していく事をある程度防ぐことができます。

もちろん、この事はScalaが関数型プログラミングをサポートしないという事を意味しませんが、パターンマッチ、代数的データ型、第一級の関数といった関数型言語に見られる機能は全てオブジェクト(およびメソッド呼び出し)に対するエンコーディングとして実現されます。

たとえば、パターンマッチはScalaではプリミティブな機能というより、オブジェクトへのunapply()メソッド呼び出しに対するシンタックスシュガーと考えることができます。第一級の関数も単にFuncionNクラスに関するシンタックスシュガーです。代数的データ型は、クラスの継承機構を利用して実現されています。

このように、Scalaはクラスベースのオブジェクトシステムを核言語として、関数型プログラミング言語に見られる諸機能を、その核言語への変換として実装した言語と見ることができます。

再度言いますが、Scalaが関数型プログラミングをサポートしないという事はありません。しかし、Scalaは、型付きλ計算(の発展系)が基盤にあるML族の言語と起源が異なる事を知っておくのは(不要なフレームを避けるためにも)良いことでしょう。