1

私は関数型プログラミングにもっと慣れようとしています.リストを2つのペアにグループ化し、それらのペアに関数を適用するよりエレガントな方法があるかどうか疑問に思っていました.

case class Line(start: Vector, end: Vector) {
  def isLeftOf(v: Vector) = (end - start).cross(v - start) < 0
}

case class Polygon(vertices: List[Vector]) {
  def edges = (vertices.sliding(2).toList :+ List(vertices.last,vertices.head)).map(l => Line(l(0), l(1)))
  def contains(v: Vector) = {
    edges.map(_.isLeftOf(v)).forall(_ == true)
  }
}

私はこの行について話している

def edges = (vertices.sliding(2).toList :+ List(vertices.last,vertices.head)).map(l => Line(l(0), l(1)))

これを書く良い方法はありますか?

4

2 に答える 2

2
val edges = (vertices, vertices.tail :+ vertices.head).zipped map Line

次の質問も参照してください。

Scala リストをペアにするにはどうすればよいですか?

シーケンス要素を組み合わせる最も簡潔な方法

于 2012-09-01T23:30:12.500 に答える
0

これを行うことで、少し単純化できます。

case class Polygon(vertices: List[Vector]) {
  def edges = Line(vertices.last, vertices.head) :: vertices.sliding(2).map(l => Line(l(0), l(1))).toList
  def contains(v: Vector) = edges.forall(_.isLeftOf(v))
}

私は3つのことをしました:

  1. 最後の行/見出し行を引き出して、map
  2. toListafterに移動しmapて、Iterator をマップし、2 つのリストを作成する手間を省きました。
  3. 単純に述語でcontains呼び出すように簡略化されています。forall
于 2012-09-01T21:33:50.953 に答える