読者です 読者をやめる 読者になる 読者になる

opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

scalaで関数自体の型のようなもの

ということで早速scala記事。
とりあえず今日は、scalaの関数について。
例えば、JSのような言語も関数を関数の引数に渡したり戻り値で返したりできるが、JSにはFunctionという型がある。Scalaでも型があるのかなーなんて思ってたけど型というかよくわからないものがある。

Int => Int

というもの。
これはIntを1つ受け取りIntを1つ返す関数を表す。(と思う)
例えばこの関数を引数にとるような関数hogeを定義する。

def hoge(x:Int => Int):Int = {
    x(10)
}  

例えばこんな感じ。呼び出してみるとこんな挙動...

> hoge((x:Int) => x*2)
-> 20
> hoge((x:Int) => x*3)
-> 30

という感じ。こんな具合にscalaは関数を引数に渡したりすることができる。

では次は戻り値として扱ってみる。実際には型を省略しても大丈夫のようだがあえて今回は指定してみる。

def piyo(x:Int):Int => Int = {
    (y:Int) => x * y
}

これは最初にpiyoに渡したxの値倍する関数っていうのを返す関数。
呼び出してみると次のようになる。

> val a = piyo(10)
> a(2)
-> 20
> a(3)
-> 30  
> val b = piyo(100)
> b(2)
-> 200

という具合になる。
なかなかおもしろい。前にも書いたとおり戻り値の型は省略できる。

ここからは若干補足なのだがscalaは関数の定義を次のようにも行える。

def func(){
    ....
}

ただ、このように定義した場合、関数の戻り値は自動的にUnitである。つまりCでいうvoidで戻り値なしの関数である。
関数型言語として使う場合は使うことはない... か、あっても時々? っていうくらいの定義方法。 関数を定義するときは "=" をつけるのを忘れないようにする...

いやはや、一応Scalaオブジェクト指向もできるので関数の型のようなものがあるのかと勘違いして色々調べてたけどよくわからないものがあって型みたいな感じで使えるってことがわかった。
scala詳しい人ならこいつの正体もわかるのだろうけどなんせ入門して数日なのでいまいちこいつの正体がわからない。
が、一つの疑問にある程度の答えは出せたのでよしとしよう。
ということで本日は以上。

Firefox ブラウザ無料ダウンロード