scalaのeta-expansionってなんなのかようやくわかった

Scala初学者向けです。

最近読んでる本によくこのキーワードが出てきて、
どんなことが起きてるかは解ってたんですが
『なにに使うの?』っていうのをやっと理解した(と思う)のでメモ

scalaにおけるeta-expansionとは

メソッドをFunctionNトレイトのインスタンスにする機能

どうやって使うの?

使い方は2種類あって、後者は意識せずとも使ってるはずです。(後述)

  1. メソッドの後ろにアンダーバーをつける
  2. FunctionNトレイトが求められるときにメソッドを渡すと自動で変換される

これがあると何が嬉しいか

(誤解がありそうだが)defで定義されたものはメソッドで、
valで定義されたものは(狭義の)関数です。

この場合のメソッドと関数の違いとは、第一級であるかどうかで、
関数は第一級オブジェクト、メソッドはそうじゃなくなります。

(これも誤解あるし、僕も正確にはわかってないと思いますが)
第一級であると何が嬉しいのか、それは値に束縛したり、
引数に渡す、結果として返す
ことができます。

内部的には何をしているか

冒頭のサンプルをもう一度。2つ目の式は下記と同義になります
(多分・・・)

(カリー化されているので)Int型を一つ渡すとInt型を受け取って
Int型を返す関数
が返ってくるFunction1のインスタンスがaddFunction
に束縛されます。

これでメソッドが関数(≒FunctionN型のインスタンス)になりました。
applyメソッドを持つインスタンスなので

いずれも同じ処理、同じ結果を行っています。

使い方も何をしているかもわかった、で、どこで使うのか

2種類の使い方があって、言い換えると明示的に行うか、暗黙的に
行うか、の違いです。そして暗黙的に変換する機能がないと、
結構厳しくなります(defで定義したメソッドが、束縛できない、渡せない、結果として受け取れない、ものになる)

どこで変換されているか。

というメソッドがあって、これを他の関数(メソッド)に
渡したいとき(ひどい例ですがお許しを・・・)

このような定義をしたとします。前述したように
値への束縛、引数に渡す、結果として受け取るには第一級でなくては
ならないので、このメソッドが求めているのはFunction1[Int,Int,Int]
のインスタンス(≒関数)ということになります。

そこにメソッドを渡します

そうすると、求められているFunction[Int,Int,Int]に
自動で変換されます。これが後者の暗黙的なeta-expansion
になります。

こんな感じで知らない間に多用していることをようやく理解しました。
メソッドと関数の違いもdefvalで定義したときの違い、くらいに
しかわかっていなかったので、勉強になりました。メモメモ

eta-expansionっていう言葉はどういう意味?

僕数学とか全然なんですけど、会社の人に聞いたら、たぶんこれっぽい

ラムダ計算 wikipedia

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です