20

私は興味があります-のメソッドのU宣言におけるジェネリック型のポイントは何ですか?Traversableforeach

def foreach[U](f: A => U): Unit

の戻り型Function1は共変であるため、なぜそれだけではいけないのでしょうか。

def foreach(f: A => Any): Unit

4

2 に答える 2

10

マーティン・オーダスキーではないので、推測することしかできません:-)のスカラドックを見ると、次のforeachことがわかります。

  /** Applies a function `f` to all elements of this $coll.
   *
   *  @param  f   the function that is applied for its side-effect to every element.
   *              The result of function `f` is discarded.
   *              
   *  @tparam  U  the type parameter describing the result of function `f`. 
   *              This result will always be ignored. Typically `U` is `Unit`,
   *              but this is not necessary.
   *
   *  @usecase def foreach(f: A => Unit): Unit
   */

したがって、の戻りタイプは重要でfはなく、その結果は常に破棄されます。これは、私にとって、ここでジェネリック型パラメーターを使用して戻り型をマークすることは、「戻り型は何でも、本当に何でもかまいません」と言って、単なるドキュメントの微妙なことであることを示唆しています。の戻り型はAny、(一部の)読者に、ここで適用可能な関数型に対するある種の制限を示唆する場合があります。

もう1つの側面は、Scalaがゼロからジェネリックになるように非常に意識的に設計されていることです。したがって、私にとって、ここでジェネリック型パラメーターを使用することは、言語の一般的な哲学と一致しますがAny、技術的には使用可能ですが、使用することは、他の言語とは相容れない、明らかに非ジェネリックなアプローチになります。

于 2012-12-30T21:19:58.947 に答える
-5

から継承し、からのTraversable戻り値を使用できるようにするためでしょうか。Uf: A => U

trait TraversableWithHandler[+A, E <: Option[Throwable]] extends Traversable[A] {
  override def foreach[U](f: A => U): Unit
  def handleError(t: E) 
}

たとえば では、 from insidejQueryの戻り値はと同等であり、異なる値は.falseforeachbreakcontinue

使用事例

breakable { 
  List(1,2,3).foreach(_ match { 
    case 1 => println("ok")
    case 2 => 
      println("Sort of, soft interrupt?")
      return false
    case 3 => break
  })
}

次のコード (並列) が壊れることはないため (この場合、スタックレスのスロー可能なソリューションは理想的ではないようです):

import scala.util.control.Breaks._

breakable { 
  (0 to 100).toList.par.foreach(_ match { 
    case n if (n <= 50) => 
      println("#" * 100)
      try { break } catch { 
        case t: Throwable => println("" + t); break 
      }
    case n if (n > 50) => 
      println("" + n)
    case _ => "ok" 
  }) 
}
于 2012-12-30T21:13:38.893 に答える