5

次のように、整数のリストを逆にしようとしていました。

List(1,2,3,4).foldLeft(List[Int]()){(a,b) => b::a}

私の質問は、型を として指定する代わりに、scala の型推論メカニズムによって自動的に入力された型になるようList[_]にシードを指定する方法があるということです。_List[Int]

ありがとう

4

2 に答える 2

5

更新: Scala の型推論についてもう少し読んだ後、あなたの質問に対するより良い答えを見つけました。Scala 型推論の制限に関するこの記事には、次のように書かれています。

Scala の型情報は、関数の引数からその結果 [...] へ、引数リストを左から右へ、ステートメントを最初から最後へと流れます。これは、(大まかに言えば) 型情報があらゆる方向に無制限に流れる完全な型推論を備えた言語とは対照的です。

問題は、Scala の型推論がかなり制限されていることです。最初に最初の引数リスト (この場合のリスト) を調べ、次に2 番目の引数リスト (関数) を調べます。しかし、それは戻りません。

これが理由です。

List(1,2,3,4).foldLeft(Nil){(a,b) => b::a}

これも

List(1,2,3,4).foldLeft(List()){(a,b) => b::a}

動作します。なんで?まず、 の署名foldLeftは次のように定義されます。

 foldLeft[B](z: B)(f: (B, A) => B): B 

したがってNil、最初の引数として使用するzと、コンパイラはNil.type型パラメーターに割り当てますB。を使用するList()と、コンパイラは for を使用List[Nothing]Bます。

これで、2 番目の引数の型fが完全に定義されました。あなたの場合、それはどちらかです

(Nil.type, Int) => Nil.type

また

(List[Nothing], Int) => List[Nothing]

どちらの場合も、戻り値の型が であると推測されるため、ラムダ式(a, b) => b :: aは有効ではありませんList[Int]


上記の太字部分は、「引数」ではなく「引数リスト」であることに注意してください。記事は後で説明します:

型情報は、引数リスト内で左から右に流れるのではなく、引数リスト全体で左から右に流れるだけです。

したがって、単一の引数リストを持つメソッドがある場合、状況はさらに悪化します。

于 2012-11-21T07:54:56.147 に答える
4

私が知っている唯一の方法は

scala> def foldList[T](l: List[T]) = l.foldLeft(List[T]()){(a,b) => b::a}
foldList: [T](l: List[T])List[T]

scala> foldList(List(1,2,3,4))
res19: List[Int] = List(4, 3, 2, 1)

scala> foldList(List("a","b","c"))
res20: List[java.lang.String] = List(c, b, a)
于 2012-11-21T06:58:49.697 に答える