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

コメント

コメントがまだありません。感想を最初に伝えてみませんか?

ログインして広告を非表示にする
ログインして広告を非表示にする