私はfoldLeft
を使用してリストを構築する場合、私は多くの場合、明示的に注入されたパラメータを入力することでイライラして、私はちょうど代わりに `ナシ」を使うことがしたい - ここでの不自然な例です:Nilをfold leftに渡すのはなぜですか?
scala> List(1,2,3).foldLeft(List[Int]())((x,y) => y :: x)
res17: List[Int] = List(3, 2, 1)
scala> List(1,2,3).foldLeft(Nil)((x, y) => y :: x)
<console>:10: error: type mismatch;
found : List[Int]
required: scala.collection.immutable.Nil.type
List(1,2,3).foldLeft(Nil)((x,y) => y :: x)
これはそれほど悪くないですList[Int]
であるが、あなたが指定する必要のある複数のクラス名があるので、もっと長い名前やタプルやその他のコンテナのリストを持つことになるあなたのクラスのリストを使用し始めると、恐ろしいことになる。
list.foldLeft(List.empty[(SomethingClass, SomethingElseClass)]) { (x,y) => y :: x }
私は、それがうまくいかないのは、5 :: Nil
のようなものでは、コンパイラは空のリストの型をList[Int]
と推測できますが、にパラメータとしてNil
が渡されたときには、その型が使用されるまでの時間が設定されます。しかし、それができないことは本当に本当ですか? 2番目の引数として渡された関数の戻り値の型から型を推論することはできませんか?
もしそうでなければ、ちょっとわかりません。
Scalaがこの種の状況の型を推論できないのは悲しいことです。これが将来改正されることを祈りましょう。 –
実際にはあまり問題にならないはずです。あなたが特定のクラスを扱っているだけの場合は、タイプ 'S =(SomethingClass、SomethingElseClass)'または 'val nil = List.empty((SomethingClass、SomethingElseClass) ')の型エイリアスを作ります。ジェネリックメソッドを書いているなら、型は既に 'T'や' U'のような短いエイリアスを持っています。 –