2
  def flatten(l: List[_]): List[_] = {
    def iflatten(l: List[_], ret: List[_]): List[_] = l match {
      case Nil => ret
      case h :: Nil =>
        if( h.isInstanceOf[List[_]]) { iflatten(h, ret) }
        else {
          l.head :: ret
          iflatten(l.tail, ret)
        }
    }
  }

これを行うには複数の方法があることは知っていますが、私の方法が100%正しいとは確信していません。私はそれをテストしたいと思いますが、私が実行している1つの問題は、私が呼び出す2番目のケースステートメントにあります:

... { iflatten(h, ret) }

コンパイラ エラーが発生します。

error: type mismatch;
found   : Unit
required: List[?]

私はこれらの型の問題に取り組み、過去に取り組んできたものとは異なる型システムについてもっと学ぼうとしています。コンパイラが不平を言っている理由についての提案は大歓迎です。

4

5 に答える 5

2

これはShapelessライブラリが得意とするところだと思います。

https://github.com/milessabin/shapeless/blob/master/examples/src/main/scala/shapeless/examples/flatten.scala

于 2013-08-27T08:17:21.920 に答える
1

申し訳ありませんが、このコードは非常に複雑です。私はそれを単純化しようとし、この解決策にたどり着きました:

    scala> :paste
    // Entering paste mode (ctrl-D to finish)

        def flatten(l : List[_]) : List[_] = l flatMap {
          case l1 : List[_] => flatten(l1)
          case otherwise => List(otherwise)
        }


    // Exiting paste mode, now interpreting.

    flatten: (l: List[_])List[_]

    scala> flatten(List(1,2,3))
    res3: List[Any] = List(1, 2, 3)

    scala> flatten(List(1,2,List(3,4)))
    res4: List[Any] = List(1, 2, 3, 4)

    scala> flatten(List(List(1,List(2),3),4,List(4,5)))
    res5: List[Any] = List(1, 2, 3, 4, 4, 5)

コードを修正した後 (への呼び出しを追加iflat)、次のリファクタリングを行いました。

  1. 内部メソッドを削除しました
  2. 繰り返しに組み込みを使用しましflatMapた(したがって、一部の式を削除または簡素化できcaseます)
  3. instanceOfタイプガードに交換

より簡単な解決策は、形のないライブラリを使用することだと思います(ヒント:「ボイラープレート」部分を探してください)。

于 2013-08-27T08:19:33.993 に答える