scala 関数

scalaは関数がfirst classオブジェクトなので関数を引数に渡したり出来る。

今まで触ってきた言語(coq除く)は型なしの言語ばかりだったので、戸惑うこと多し。

def test(f:(Int => Int) { f(100) }

test(x=>x+100)
// Int = 200

test{x=>x+200}
// Int 300
// 関数リテラルを引数で渡すときは、小括弧でも中括弧でもよいようだ。


//引数なしの関数リテラルを引数に渡したい場合。
def test2(g:(() => Int) { f() }

// NG def test2(g: => Int) { f() }
// NG def test2(g:(=>Int)) { f() }

Play2の trait Action は、

  • Request型変数引数に取ってStatus型変数を返却する関数か、
  • 引数を取らずに、Status型変数を返却する関数

を引数に取るようだけども、
宣言の読み方がまだちっとも分かってない。

https://github.com/playframework/playframework/blob/2.4.4/framework/src/play/src/main/scala/play/api/mvc/Action.scala

trait Action[A] extends EssentialAction {
...

の[A]ってなんや。

javaの関数の引数違いのOverrideは
applyメソッドを引数や戻り値を違ったふうに何回も宣言するのか。
applyを特別扱いしてるので
Action.apply(パターン1)は Action(パターン1)と書けるらしいな。