Scala実践プログラミング、まだちゃんと読み込んでないけど、他の人も言ってるようにターゲットとしてる層がよくわからない(これは編集の都合だよね・・?)。前半はばっさり切って、その分後半詳しく説明してくれたほうが助かるかも 続く #shuwa_scala
2011-06-21 22:38:45@nanjakkun 別に反論ではないのですが、前半ばっさり切っちゃうのは、それはそれで難しいところでして…。概要編は、単なるScala入門ではなく、重要な点(たとえば、メソッド!=オブジェクトとか)にも触れているので、読んでいただければ嬉しいです。 #shuwa_scala
2011-06-24 23:30:25@kmizu P158辺りの内容でしょうか?以前Object Pascalを触っていたときに「FunctionとFunction of Objectは別物 」ってのがあったのでここはあまり引っかかりを感じなかったのですが、Javaから入ると疑問を感じやすい場所なんでしょうか?
2011-06-25 00:16:55@nanjakkun Scalaでは「関数はファーストクラスオブジェクト」と宣伝して、メソッドを関数オブジェクトとして渡す例がよく出てくるので、メソッド=関数オブジェクトのように誤解する人が結構居るんです。 #scala
2011-06-25 06:54:14@nanjakkun ですから、Javaに限った話でもないです。メソッド→関数オブジェクトへの変換規則が定義されているから、メソッドがオブジェクトのように見えてしまうけど、実際には別物という話ですね。 #scala
2011-06-25 06:55:32@kmizu なるほど。コップ本見てみても、その辺り詳しく書いてないようですし、そういう意図で今回の本に盛り込まれたんですね。
2011-06-25 09:06:02@nanjakkun はい。ただ、意図が伝わりにくい書き方になっていたのは、私の書き方が悪かったのだと思います。 #shuwa_scala #scala
2011-06-25 09:52:55ところで、Scala界隈(公式サイト含む)に物申したいのだけど、関数(オブジェクト)とメソッドを混同させるようなチュートリアルやらはやめた方がいいんじゃないかと思う。これ、結構色々な人がつまづいてるんだけど、 #scala
2011-06-25 09:54:37というか、Scala言語仕様自体が、def ... を「Function Declaration」とか言っておいて、その型は「Method Type」です、とか非常に紛らわしい。MLにメール投げてみるか。 #scala
2011-06-25 09:55:49Scalaの型システムに関する基本知識1: ScalaにはValue Type(いわゆる普通の型) と Non-Value Type(メソッドの型とか) がある。 #scala
2011-06-25 09:57:01関数オブジェクト(FunctionNを継承したもの。無名関数含む)は、Value Typeを持つ。整数とかその他オブジェクトもValue Type。 #scala
2011-06-25 09:57:49Non-Value Typeの代表例としては、Method Typeがある。たとえば、 def foo(x: Int): Int で、fooの型は (Int) Int 。この型の値は「存在しない」。 #scala
2011-06-25 10:02:16@kmizu 言葉の定義が難しいですよね。「(所謂)関数」「(所謂)メソッド」「関数オブジェクト」「ローカル関数」を正確にしないと紛らわしさが残るわけで。(所謂)関数っていうのはオブジェクトに従属しない処理のことだけど、Scalaではファーストクラスオブジェクトじゃない、とか。
2011-06-25 10:03:17で、話がややこしいのが、Method Typeは特定の文脈では、Value-Typeであるところの、関数オブジェクトに変換可能、という点。 #scala
2011-06-25 10:03:22具体的には、Function Typeが要求されているところに、それに合致する(これを厳密にするとちょっと面倒) Method Typeがあると、Function Typeに自動変換される。 #scala
2011-06-25 10:04:19あとは、Method Type型のメソッドに _ を付けると、Function Typeのオブジェクト(関数オブジェクト)に変換される。 #scala
2011-06-25 10:05:15@aoi0308 ですね。たとえば、「ローカル関数」はdefで定義され、Method Typeを持つので、ファーストクラスオブジェクトじゃないのですが、オブジェクトには従属していません。型的にはメソッドと同じ扱いになります。 #scala
2011-06-25 10:08:06@kmizu でもScalaだと(所謂)メソッドも関数オブジェクトに変換できてしまうので、初学者にとって、関数なの?メソッドなの?なにこいつ?っていう疑問が出てきます。(まぁ気にしない人もいるんだろうけど、自分は疑問に思った)
2011-06-25 10:09:35補足すると、Method Typeのような何かはJavaにも存在します。ただ、言語仕様としてそれをMethod Typeとして定義していないだけであって。 #scala #java
2011-06-25 10:20:03@kmizu 混乱の元は「Scalaでは関数もファーストクラスオブジェクトです。」の一文かな~と個人的には思ってます(公式でどういう言い方をしているのかは知りません)。ここで言っている「関数」と一般的に言われる「(所謂)関数」は違うということを知る必要があるのかなと。
2011-06-25 10:20:20@kmizu まぁつまりそれが先ほど言っていた「Function Type」なのか「Method Type」なのかを正しく認知するっていうことなんでしょうけど。初学者の戯言でした。
2011-06-25 10:22:54@aoi0308 ええ。その通りかと。公式でも「every function is a value」と言っています。ここで、functionが「(所謂)関数」と異なるものである事が記述されていないんですね。
2011-06-25 10:24:02