.net column
.NET開発者のためのブログメディア

人気言語Scalaの大まかな入門編|基本や特徴について分かりやすく解説!

2021年09月15日
SE
現在話題になっているプログラミング言語のScalaについて詳しく教えてください。
PM
分かりました。プログラミング言語Scalaについてご紹介いたしましょう。

Scalaとは?


ScalaとはJavaをベースにしたプログラミング言語で、オブジェクト指向はもちろんのこと、関数型プログラミングも両方扱える現在注目のプログラミング言語です。

オブジェクト指向とは、プログラムを手順ではなくオブジェクト(モノ)の作成と操作とみる考え方のことです。代表的なものにJavaがあります。

関数型プログラミングとは、関数の組み合わせでプログラムを作成していく形式のものを指します。

Scalaのインストールの方法

ここではWindows10での話を進めます。参考サイトURLのページの通りにダウンロードし、それぞれをインストールして行きます。まず、ScalaではJavaのライブラリがそのまま使えます。そのためにJava 8 JDKかJava 11 JDKをインストールし、パスを通します。

そして、ビギナーにお勧めのScalaのIDE(総合開発環境)、IntelliJをインストールするかScala Build toolのsbtをインストールします。最後にScalaをインストール後、binフォルダのbatファイルをそれぞれダブルクリックすればScalaがインストール完了です。

ScalaでHello, World!

それでは、お決まりのHello, World!をPowerShellで表示してみましょう。ソースコードは下記の通りです。

これをobjectの名を冠にしたHelloWorld.scalaとして保存します。コンパイルは下記の通りです。

そして、

と表示されます。

Javaとの関係

ScalaではJavaのパケージのクラスがそのままインポートできます。

Scalaではワイルドカード*は_となります。また、四則演算子の+や*などはスペースを空けなければなりません。

上記のソースコードは次のように表示されます。

全てがオブジェクト

Scalaでは数値はもちろんのこと、予約語以外全てがオブジェクトとして扱われます。当然、関数もオブジェクトです。次に1秒ごとに「time flies like an arrow…」と表示するプログラムを作ります。ソースコードは次の通りです。

ここで関数の部分は次の箇所です。

匿名関数

先のプログラムで関数はtimeFiles()だけです。それも1度きりしか使用しません。このような場合は匿名関数を使ってプログラムを簡略できます。ソースコードは以下の通りです。

Scalaでは匿名関数は=>で表します。

クラス

Scalaはオブジェクト指向言語ですので、クラスという概念を持っています。Javaの構文と似ていますが、Scalaのクラスではパラメーターを持つことができます。以下の複素数を表すソースコードを見てください。

これをコンパイルすると

と表示されます。

しかし、実部と虚部のreとimのメソッドは、それらを呼ぶとき()をつけなければなりません。Scalaでは、それがフィールドのようにアクセスできるのです。引数なしのre、imとだけのメソッドがあるのです。

継承とオーバーライド

Scalaにおいては、全てのクラスはスーパークラスを継承します。先の複素数のプログラムのように、スーパークラスが指定されていないときには、暗黙的にscala.AnyRefが使用されます。

Scalaでは、スーパークラスから継承されたメソッドはオーバーライドできます。その時に想定外のオーバーライドを防ぐために、override修飾子を明示的に書き込んで指定することが必須です。

先の複素数のプログラムを使ってオーバーライドを見てみましょう。

これが、

と出力されれば、toStringがoverrideされたことになります。

case classとパターンマッチ

Scalaでの木(ツリー)がどのように表現され、操作されるのか見てみましょう。Javaでは木は具象クラスで表現され、関数型プログラミングでは代数的に表現されますが、Scalaではcase classというもので表現されます。

case classと通常のクラスの違いは、次の通りです。
●new演算子が必要ない
●ゲッター関数は自動的に定義される
●メソッドequalsとhashCodeのデフォルト定義が提供される
●case classのインスタンスはパターンマッチで分解できる

環境の型

データ型を定義できたので、ある環境における式を評価する関数から始めます。環境の目的は変数に値を与えることです。

これで評価関数を定義できます。

評価関数eval

evalはパターンマッチを実行することで、プログラムが動作します。
●tがSumかどうか評価します。もしそうならば左部分木をl、右部分木をrとします。そして、矢印に続く式を評価します。
●もし最初の評価が違うのであれば、つまり、木がSumでなければtがVarであるか評価します。評価が正ならばVarノードに含まれる変数をnにし、右側の式に進みます。
●もし2つめも違うのであれば、つまり、tがSumでもVarでもなければConstであるかどうかを評価します。そうであるならばConstノードの含まれる値を変数vとします。そして、右側に進みます。
●最後に全ての評価にマッチしなければ、例外が発生します。

パターンマッチとは、連続する値のパターンにマッチさせてみて、マッチすれば値に名をつけ抽出し、最終的にそれらの名のついた値を何らかのコードで評価することをいいます。

評価関数derive

次に数式微分を定義します。ソースコードは次の通りです。

●Sumの微分係数は微分係数の和です。
●ある変数vの微分係数は、変数vで微分されれば1、そうでなければ0です。
●定数の微分係数は0です。

main関数の定義

簡単なmain関数を定義します。ソースコードは次の通りです。

まず、環境における{x -> 5, y -> 7}を計算し、次にxとyの微分係数を求めます。

整理すると

全てのプログラムを整理し、object Calcで囲むと次のようになります。

このソースコードをCalc.scalaとして保存し、コンパイルします。次のように出力されれば成功です。

SE
ありがとうございます。わたしもScalaを習得してみようと思います。
PM
そうですね。ScalaはJavaをベースにしたプログラミング言語ですので、理解しやすいと思います。

Scalaを学ぼう

Scalaの入門編として解説しましたがいかがでしたでしょうか。ここではトレイトとジェネリクスには言及しませんでしたが、Scalaの理解を深めたい方はぜひ調べてみてください。

Scalaは人気のプログラミング言語ですので、基本を学んだならば、どんどん自分でコードを書いて挑戦してみましょう。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags