2017-08-10 4 views
0

あり私のコードの2種類がいる、それが働いた:動作が異なる方法でラップ:Scalaの

一つはflatten直接

val list = List(List(1, 2), List(3, 4)) 
println(list.flatten) 

他の使用方法を使用しています

val list = List(List(1, 2), List(3, 4)) 
println(flatten(list)) 

def flatten(list: List[Any]): List[Any] = { 
     list.flatten//this is the line 28 
} 

エラーが発生します:

Error:(28, 14) No implicit view available from Any => scala.collection.GenTraversableOnce[B]. 
     list.flatten 

Error:(28, 14) not enough arguments for method flatten: (implicit asTraversable: Any => scala.collection.GenTraversableOnce[B])List[B]. 
Unspecified value parameter asTraversable. 
     list.flatten 

なぜ、どのように解決するのですか?

答えて

1

これは必要な方法です。

def flatten[A](list: List[List[A]]): List[A] = { 
    list.flatten 
} 

ジェネリックA(または任意の名前をあなたがそれを与えたい)タイプAnyは異なっています。一般的な意味は「Listの中で一貫した何らかのタイプ」を意味し、Anyは「Listの中の要素については何も知らない」という意味です。

したがって、List[Any]は、コンパイラがリストの内容について何も知らないため、フラット化できません。 (List[List[Any]]を平坦化することができるが、結果はコンパイラがAに意味を添付しているだろうのでList[A]などとして有用ではありませんList[Any]ある(IntCharString、....)それは、次の結果が得られますList[Int],List[Char],List[String]、....)。

関連する問題