Skip to content

Instantly share code, notes, and snippets.

@yamashiro
Created May 18, 2012 10:13
Show Gist options
  • Save yamashiro/2724450 to your computer and use it in GitHub Desktop.
Save yamashiro/2724450 to your computer and use it in GitHub Desktop.
これなんでコンパイルエラーになるの?
class Hoge() {}; var hoge = List(new Hoge()); hoge foldLeft(Map[String, Hoge]()) ( (map:Map[String,Hoge], hoge:Hoge) => map + ("hoge" -> hoge) );
@kmizu
Copy link

kmizu commented May 18, 2012

これは、Scalaのメソッド呼び出しの構文によるものです。

hoge foldLeft(MapString, Hoge) ( (map:Map[String,Hoge], hoge:Hoge) => map + ("hoge" -> hoge) )

は、 レシーバhogeの後に.が続いていないので、「2項演算子形式」のメソッド呼び出しとみなされます。つまり、

    hoge foldLeft (Map[String, Hoge]()) ( (map:Map[String,Hoge], hoge:Hoge) => map + ("hoge" -> hoge) )

==> hoge.foldLeft( (MapString, Hoge) ( (map:Map[String,Hoge], hoge:Hoge) => map + ("hoge" -> hoge) ) )
という風に解釈されます。ここで、この解釈ですと、
Map[String, Hoge]に対してapplyメソッドを呼び出すことになります。このとき、引数の型はStringである事が期待されるのに、
(map:Map[String,Hoge], hoge:Hoge) => map + ("hoge" -> hoge)) という式によって (Map[String, Hoge], Hoge) => Map[String, Hoge]
という型になってしまうため、

found : (Map[String,this.Hoge], this.Hoge) => Map[String,this.Hoge]
required: java.lang.String

というエラーになるのです。個人的なアドバイスとしては、foldLeft, mapなどのいわゆる高階関数は、レシーバには.を付ける事をお勧めします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment