SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

今からでも遅くない これから始めるScala

今からでも遅くない これから始めるScala(中編)

関数型言語としてのScala


  • このエントリーをはてなブックマークに追加

 「今からでも遅くない これから始めるScala」の中編である今回は、Scalaの関数型言語としての側面を紹介します。関数型言語と言ってもさまざまなものがありますが、どれも「ファーストクラスの関数オブジェクトを持つ」という特徴があります。

  • このエントリーをはてなブックマークに追加

関数型言語としてのScala

 「今からでも遅くない これから始めるScala」の中編である今回は、Scalaの関数型言語としての側面を紹介します。

 「関数型言語」と言ってもさまざまなものがあります。LispやScheme、Haskell、OCaml、Erlangなどですが、どれも「ファーストクラスの関数オブジェクトを持つ」という特徴があります。つまり関数を値として変数に代入したり、関数の引数に関数を与えたり、関数オブジェクトを新しく作り出す関数を定義したり、ということが可能です。

関数についてのおさらい

 前編で解説した内容ですが、Scalaでの関数定義の方法をおさらいします。

関数の定義

 Scalaでは、関数の宣言はdefキーワードを用います。次のような書式となります。

[リスト1]Scalaの関数宣言
def 関数名[型パラメータ]( 引数名:引数型,・・・ ):結果型 = {
  関数本体
}

 以下は、偶数であるか判定する関数です。

[リスト2]関数の例 isEven関数
scala> def isEven( n:Int ):Boolean = {
     |   n % 2 == 0
     | }
isEven: (n: Int)Boolean

scala> isEven( 4 )
res0: Boolean = true

 Scalaでは、関数本体のなかで最後に評価された式の値が結果値となります。また、関数宣言の結果型は省略可能であり、本体が一つの式である場合は{}を省略できます。isEven関数を省略したものが以下の定義です。

[リスト3]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")のように書くことはありません。これと同様に関数を生成する記法が関数リテラルです。

 関数リテラルの書き方はいろいろなバリエーションがありますが、最もオーソドックスな記法は次のように書きます。

[リスト4]関数リテラルの記法
(引数1:型, 引数2:型, ・・・) => { 処理 }

 先ほどのisEven関数を、関数リテラルを用いて定義してみます。

[リスト5]関数リテラルを用いた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連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 尾崎 智仁(オザキ トモヒト)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5251 2010/07/09 15:48

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング