Statistical Programming

Scala 関数の書き方

 

Scalaでは関数の書き方がJavaとは異なる上、Javaよりもより強力な関数的機能が備わっています。まずは関数の定義の仕方から。Scalaでは記述方法がかなり柔軟なためいろいろあるのですが、代表的な書き方を二つほど。

 

def 関数名(引数の変数名:変数の型):戻り値の変数の型={ 処理 }

 

また、defではなくval を使って記述もできます。無名関数(匿名関数や関数リテラルとも呼ばれ、関数名がない関数)を変数に代入(バインド)するやり方です。

 

 

val 関数名=(引数の変数名:変数型)=>{ 処理 }:戻り値の変数の型

 

 

さらに、Scalaでは関数自体を値として引き渡すことも出来ます。javascript経験者はすぐに「ああ、あれか」と思うことでしょう。そういった関数のことを高階関数と言います。関数をオブジェクトとして扱う少し次元の高い関数という意味です。下記の例では opetwolisという関数の引数に add 関数とmul 関数を渡しています。

 

→ def をつかった書き方で 足し算を行うadd 関数を定義

→ val を使った書き方でかけ算を行う mul 関数を定義

→ 二つの配列と一つの関数を引数として、配列を戻す opetwolis 関数を作成

→ 戻り値となる配列 resultlist を作成

→ for を使いそれぞれの配列から一つずつ値を取り出し引数として渡された関数の処理を施した後 resultlist に格納(addではふたつを足し、mulでは二つをかける)

→ これでopetwolis関数の定義が完了したのであとは実際にInt型の適当な配列を二つ作りopetwolisに引数として渡してprintlnでコンソールに表示、実行。

 

 

import scala.collection.mutable.ListBuffer

 

//高階関数を作る

 

//足し算関数

def add(a:Int,b:Int):Int={

  a+b

}

//かけ算関数

val mul=(a:Int,b:Int)=>{

  a*b

}:Int

 

def opetwolis(arr1:Array[Int],arr2:Array[Int],func:(Int,Int)=>Int):Array[Int]={

  val resultlist=new Array[Int](arr1.length)

  for(i<-0 until arr1.length){

    resultlist(i)=func(arr1(i),arr2(i))

    }

  resultlist

}

val a1=Array(1,2,3)

val a2=Array(3,4,5)

 

println(opetwolis(a1,a2,add).toList)

println(opetwolis(a1,a2,mul).toList)

}

 

 

<コンソール>

 

List(4, 6, 8)

List(3, 8, 15)