「今からでも遅くない これから始めるScala」の中編である今回は、Scalaの関数型言語としての側面を紹介します。関数型言語と言ってもさまざまなものがありますが、どれも「ファーストクラスの関数オブジェクトを持つ」という特徴があります。
関数型言語としてのScala
「今からでも遅くない これから始めるScala」の中編である今回は、Scalaの関数型言語としての側面を紹介します。
「関数型言語」と言ってもさまざまなものがあります。LispやScheme、Haskell、OCaml、Erlangなどですが、どれも「ファーストクラスの関数オブジェクトを持つ」という特徴があります。つまり関数を値として変数に代入したり、関数の引数に関数を与えたり、関数オブジェクトを新しく作り出す関数を定義したり、ということが可能です。
関数についてのおさらい
前編で解説した内容ですが、Scalaでの関数定義の方法をおさらいします。
関数の定義
Scalaでは、関数の宣言はdefキーワードを用います。次のような書式となります。
def 関数名[型パラメータ]( 引数名:引数型,・・・ ):結果型 = {
関数本体
}
以下は、偶数であるか判定する関数です。
scala> def isEven( n:Int ):Boolean = {
| n % 2 == 0
| }
isEven: (n: Int)Boolean
scala> isEven( 4 )
res0: Boolean = true
Scalaでは、関数本体のなかで最後に評価された式の値が結果値となります。また、関数宣言の結果型は省略可能であり、本体が一つの式である場合は{}を省略できます。isEven関数を省略したものが以下の定義です。
scala> def isEven( n:Int ) = n % 2 == 0 isEven: (n: Int)Boolean scala> isEven( 4 ) res0: Boolean = true
関数リテラル・無名関数
Scalaではその場で名前をつけずに関数オブジェクトを作り出す関数リテラルという記法があります。
文字列は、val s = "foo"のようにダブルクォートで囲むことで生成できますので、わざわざnew String("foo")のように書くことはありません。これと同様に関数を生成する記法が関数リテラルです。
関数リテラルの書き方はいろいろなバリエーションがありますが、最もオーソドックスな記法は次のように書きます。
(引数1:型, 引数2:型, ・・・) => { 処理 }
先ほどのisEven関数を、関数リテラルを用いて定義してみます。
scala> val isEven = (n:Int) => n % 2 == 0 isEven: (Int) => Boolean = <function1> scala> isEven( 4 ) res0: Boolean = true
isEvenという変数に、関数リテラルを用いて生成した「(n:Int) => n % 2 == 0」という関数オブジェクトを代入しています。このように、変数に代入した関数オブジェクトも、通常の関数呼び出しのように「変数名(引数)」という書式で呼び出すことができます。
ここまでが、前回取り上げた関数に関してのおさらいです。
この記事は参考になりましたか?
- 今からでも遅くない これから始めるScala連載記事一覧
-
- 今からでも遅くない これから始めるScala(後編)
- 今からでも遅くない これから始めるScala(中編)
- 今からでも遅くない これから始めるScala(前編)
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 尾崎 智仁(オザキ トモヒト)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
