2017-12-21 20 views
0

以下のコードは型の不一致のためにコンパイルされません。これは型パラメータを明示的に与えることで解決できますが、Nilにはできませんでした。どのようにそれを把握していない。 は(foldRight方法についていくつかの情報がありますが、私はここに/:を使用したい)初期値の設定方法/ :(foldRightではない)

val li = List.range(1, 10) 
(Nil /: li)((a, b) => b :: a) // doesn't compile 
(List(0): li)((a, b) => b :: a) // compiles 

<pastie>:14: error: type mismatch; 
found : List[Int] 
required: scala.collection.immutable.Nil.type 
     (Nil /: li)((a, b) => b :: a) 
          ^

誰もがこの問題を解決する方法を教えてもらえますか?

+1

'/:'は 'foldLeft'ではなく' foldLeft'と同じです。 – jwvh

+0

Ops。私はいつもこれらの2つに混乱します。ありがとう。 – hirofujitaaki

答えて

0

そのあなたは、あなたがNil.typeとしての型パラメータを提供している初期値としてNilを提供する場合、理由とあなたは間違いをしています。

def /:[B](z: B)(op: (B, A) => B): B 

あなたは/:メソッドの定義が表示された場合、それがパラメータとして機能opを取る高階関数です。 opのファンクションタイプ、つまり(B, A) => Bを見ると、戻りタイプはBです。 /:Nil /: liと呼び出すと、渡される型パラメータはNil.type、つまりNil /:[Nil.type] liとなります。したがって、BNil.typeです。今

、あなたの関数でパラメータopのリテラルを見てみましょう: (Nil /: li)((a, b) => b :: a) ここで、あなたはあなたの関数でb::aリテラルを戻ってきています。詳しく見るとbのタイプは、liList[Int]であり、aList()(つまり値がNil)であるため、Intです。したがって、b :: aList[Int]のタイプを返します。ただし、関数型opBを返します。戻り型はNil.typeですが、List[Int]型を返します。それゆえ、あなたはエラーを起こしています。

あなたが初期値の代わりに、NilとしてList(0)を提供する場合、あなたはリテラルBの種類としてList[Int]を渡すと、あなたの関数にされているb::aの返されたタイプがList[Int]あり、したがってそれが働きました。

(List(0): li)((a, b) => b :: a) ~~ (List(0)/[List[Int]] li)((a, b) => b :: a) 

は、この問題を回避するには、明示的 /:方法で型パラメータを提供する必要があります。

(Nil /:[List[Int]] li)((a, b) => b :: a) 
+0

は美しく動作し、詳細な説明に感謝します。今私は理由がある。 – hirofujitaaki

2

どのように使用について:...

scala> val li = List.range(1, 10) 
li: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9) 

scala> (List.empty[Int] /: li)((a, b) => b :: a) 
res20: List[Int] = List(9, 8, 7, 6, 5, 4, 3, 2, 1) 
0

それは素敵ではないですが、

scala> val li = List.range(1, 10) 
li: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9) 

scala> ((Nil : List[Int]) /: li)((a, b) => b :: a) 
res0: List[Int] = List(9, 8, 7, 6, 5, 4, 3, 2, 1) 
関連する問題