#概要
『Demo of FOUNDATIONS OF FUNCTIONAL PROGRAMMING IN SCALA』で学習した内容を備忘録としてまとめる。
#Val関数とDef関数
###Val関数とDef関数の違い
- Val関数はデータ構造を持つオブジェクト(型はFunction0~Function22)
- Def関数はメソッド
- Def関数は引数に名前をつけることができ、Val関数はできない(型のみ指定できる)
Val関数
// 引数から得られる情報量が少ない(「Int型の値を3つ引数に取り、Date型の値を作成する」ことしかわからない)
val createDate: (Int, Int, Int) => Date = {
// do something
}
Def関数
// 引数から得られる情報量が多い(「年、月、日を受け取って、その日付をDate型の値として作成する」ことまでわかる)
def createDate(year: Int, month: Int, dayOfMonth: Int): Date = {
// do something
}
// 引数の名前を明示すれば、呼び出し時の引数の順番を変えることができる
val christmas = createDate(dayOfMonth = 25, month = 12, year = 2020)
関数を定義する際は、基本的にはDef関数を使用する
###Def関数からVal関数への変換
-
方法1
末尾にアンダースコアを付ける -
方法2
引数の型と数、戻り値の型が同じ場合、コンパイラが自動で変換する
方法1
def createDate(year: Int, month: Int, dayOfMonth: Int): Date = {
// do something
}
val valFunc: (Int, Int, Int) => Date = createDate _
方法2
def createDate(year: Int, month: Int, dayOfMonth: Int): Date = {
// do something
}
// 引数の型と数、戻り値の型が変数valFuncの型と一致している
val valFunc: (Int, Int, Int) => Date = createDate
#高階関数
###高階関数とは
関数を引数に取る関数
#プロパティベーステスト