Scalaのメソッドと関数は違うもの?

Scalaのメソッドと関数(と関数オブジェクト)の違いについて。
12
なんじゃっくん @nanjakkun

Scala実践プログラミング、まだちゃんと読み込んでないけど、他の人も言ってるようにターゲットとしてる層がよくわからない(これは編集の都合だよね・・?)。前半はばっさり切って、その分後半詳しく説明してくれたほうが助かるかも 続く #shuwa_scala

2011-06-21 22:38:45
なんじゃっくん @nanjakkun

とは言え悪い本ではないです。コップ本かバク本の次に読む本かな。

2011-06-21 22:39:38
kmizu @kmizu

@nanjakkun 別に反論ではないのですが、前半ばっさり切っちゃうのは、それはそれで難しいところでして…。概要編は、単なるScala入門ではなく、重要な点(たとえば、メソッド!=オブジェクトとか)にも触れているので、読んでいただければ嬉しいです。 #shuwa_scala

2011-06-24 23:30:25
なんじゃっくん @nanjakkun

@kmizu P158辺りの内容でしょうか?以前Object Pascalを触っていたときに「FunctionとFunction of Objectは別物 」ってのがあったのでここはあまり引っかかりを感じなかったのですが、Javaから入ると疑問を感じやすい場所なんでしょうか?

2011-06-25 00:16:55
kmizu @kmizu

@nanjakkun Scalaでは「関数はファーストクラスオブジェクト」と宣伝して、メソッドを関数オブジェクトとして渡す例がよく出てくるので、メソッド=関数オブジェクトのように誤解する人が結構居るんです。 #scala

2011-06-25 06:54:14
kmizu @kmizu

@nanjakkun ですから、Javaに限った話でもないです。メソッド→関数オブジェクトへの変換規則が定義されているから、メソッドがオブジェクトのように見えてしまうけど、実際には別物という話ですね。 #scala

2011-06-25 06:55:32
なんじゃっくん @nanjakkun

@kmizu なるほど。コップ本見てみても、その辺り詳しく書いてないようですし、そういう意図で今回の本に盛り込まれたんですね。

2011-06-25 09:06:02
kmizu @kmizu

@nanjakkun はい。ただ、意図が伝わりにくい書き方になっていたのは、私の書き方が悪かったのだと思います。 #shuwa_scala #scala

2011-06-25 09:52:55
kmizu @kmizu

ところで、Scala界隈(公式サイト含む)に物申したいのだけど、関数(オブジェクト)とメソッドを混同させるようなチュートリアルやらはやめた方がいいんじゃないかと思う。これ、結構色々な人がつまづいてるんだけど、 #scala

2011-06-25 09:54:37
kmizu @kmizu

この両者の違いについてちゃんと説明しているサイトは、英語圏含めて数件くらいしか見当たらなかった。 #scala

2011-06-25 09:54:42
kmizu @kmizu

というか、Scala言語仕様自体が、def ... を「Function Declaration」とか言っておいて、その型は「Method Type」です、とか非常に紛らわしい。MLにメール投げてみるか。 #scala

2011-06-25 09:55:49
kmizu @kmizu

Scalaの型システムに関する基本知識1: ScalaにはValue Type(いわゆる普通の型) と Non-Value Type(メソッドの型とか) がある。 #scala

2011-06-25 09:57:01
kmizu @kmizu

関数オブジェクト(FunctionNを継承したもの。無名関数含む)は、Value Typeを持つ。整数とかその他オブジェクトもValue Type。 #scala

2011-06-25 09:57:49
kmizu @kmizu

Non-Value Typeの代表例としては、Method Typeがある。たとえば、 def foo(x: Int): Int で、fooの型は (Int) Int 。この型の値は「存在しない」。 #scala

2011-06-25 10:02:16
あおい @aoi0308

@kmizu 言葉の定義が難しいですよね。「(所謂)関数」「(所謂)メソッド」「関数オブジェクト」「ローカル関数」を正確にしないと紛らわしさが残るわけで。(所謂)関数っていうのはオブジェクトに従属しない処理のことだけど、Scalaではファーストクラスオブジェクトじゃない、とか。

2011-06-25 10:03:17
kmizu @kmizu

で、話がややこしいのが、Method Typeは特定の文脈では、Value-Typeであるところの、関数オブジェクトに変換可能、という点。 #scala

2011-06-25 10:03:22
kmizu @kmizu

具体的には、Function Typeが要求されているところに、それに合致する(これを厳密にするとちょっと面倒) Method Typeがあると、Function Typeに自動変換される。 #scala

2011-06-25 10:04:19
kmizu @kmizu

あとは、Method Type型のメソッドに _ を付けると、Function Typeのオブジェクト(関数オブジェクト)に変換される。 #scala

2011-06-25 10:05:15
kmizu @kmizu

あとは、型コンストラクタがNon-Value Typeなんだけど、この辺りはさすがにハマらないと思う。 #scala

2011-06-25 10:05:53
kmizu @kmizu

@aoi0308 ですね。たとえば、「ローカル関数」はdefで定義され、Method Typeを持つので、ファーストクラスオブジェクトじゃないのですが、オブジェクトには従属していません。型的にはメソッドと同じ扱いになります。 #scala

2011-06-25 10:08:06
あおい @aoi0308

@kmizu でもScalaだと(所謂)メソッドも関数オブジェクトに変換できてしまうので、初学者にとって、関数なの?メソッドなの?なにこいつ?っていう疑問が出てきます。(まぁ気にしない人もいるんだろうけど、自分は疑問に思った)

2011-06-25 10:09:35
kmizu @kmizu

補足すると、Method Typeのような何かはJavaにも存在します。ただ、言語仕様としてそれをMethod Typeとして定義していないだけであって。 #scala #java

2011-06-25 10:20:03
あおい @aoi0308

@kmizu 混乱の元は「Scalaでは関数もファーストクラスオブジェクトです。」の一文かな~と個人的には思ってます(公式でどういう言い方をしているのかは知りません)。ここで言っている「関数」と一般的に言われる「(所謂)関数」は違うということを知る必要があるのかなと。

2011-06-25 10:20:20
あおい @aoi0308

@kmizu まぁつまりそれが先ほど言っていた「Function Type」なのか「Method Type」なのかを正しく認知するっていうことなんでしょうけど。初学者の戯言でした。

2011-06-25 10:22:54
kmizu @kmizu

@aoi0308 ええ。その通りかと。公式でも「every function is a value」と言っています。ここで、functionが「(所謂)関数」と異なるものである事が記述されていないんですね。

2011-06-25 10:24:02