私はScalaの 99 の問題のうちの問題 7 を解決しようとしていましたが、任意の型を含むことができるa の型を特定するのに苦労しましたList
。だから私は答えを見て、それがList[Any]
. 次のように実装をコーディングしました。
def flatten(lst: List[Any]): List[Any] = lst match {
case Nil => Nil
case x::xs =>
(if (x.isInstanceOf[List[Any]]) { flatten(x) } else { List(x) }) :::
flatten(xs)
}
ただし、これにより次のコンパイルエラーが発生します。
[error] <filename omitted>:<line number omitted>: type mismatch;
[error] found : Any
[error] required: List[Any]
[error] (if (x.isInstanceOf[Any]) { flatten(x) } else {List(x) })
[error] ^
[error] one error found
に変更isInstanceOf[List[Any]]
するとisInstanceOf[List[_]]
、同じコンパイル エラーが発生します。
短いグーグル検索とこのソリューションのコンサルティングの後、私はこれを実装しました:
def flatten(lst: List[Any]): List[Any] = lst match {
case Nil => Nil
case x::xs => x match {
case x: List[_] => flatten(x) ::: flatten(xs)
case _ => x :: flatten(xs)
}
}
これは完全に正常に機能します。では、なぜ Scala コンパイラーは、そのブロック内に入るために を渡さなければならないのに、それx
が型であると考えるのでしょうか? これはコンパイラのバグですか、それとも私が理解できない Scala の一部ですか?Any
x.isInstanceOf[Any]
List[Any]
ありがとうございました!