2

わかりましたので、Scala のコレクション演算子を練習しようとすると、これは簡単だと思いました。私の例はポイントのリストです。

このクラスは、別のポイントまでの距離を計算して返すことができます (double として)。

ただし、要素 e1、e2、e3 を考慮すると、左折は正しい解決策ではないようです。

Sum {
  e1.dist(e2)
  e2.dist(e3)
  etc
} 

API を読んでいると、「sliding」という関数に気付きました。おそらく、それは別の演算子と組み合わせた正しい解決策です。もちろん、ループでこれを行う方法は知っていますが、scala の方法を学ぼうとしています。

ありがとう

import scala.math._

case class Point(x:Int, y:Int) {
  def dist(p:Point) = sqrt( (p.x-x)^2+(p.y-y)^2 )

}

object Point {

  //Unsure how to define this?
  def dist(l:Seq[Point]) =l.foldLeft(0.0)((sum:Double,p:Point)=>)

}
4

2 に答える 2

4

あなたが何をしたいのかよくわかりませんが、距離の合計が必要だと仮定します:

l.zip(l.tail).map { case (x,y) => x.dist(y) }.sum

またはスライドで:

l.sliding(2).map { 
  case List(fst,snd) => fst.dist(snd)
  case _ => 0
}.sum
于 2012-10-31T07:22:29.230 に答える
3

フォールドとして実行したい場合は可能ですが、合計と前の要素の両方を保持するためにアキュムレータが必要です。

l.foldLeft(l.head, 0.0){ 
  case ((prev, sum), p) => (p, sum + p.dist(prev)) 
}._2

最後の要素と合計からなるタプルで終了するので._2、合計部分を取得するために使用します。

ところで、^Int はパワーではなくビットごとの論理 XOR です。を使用しmath.powます。

最も賢明な方法はおそらくzipped、イテレータの一種である を使用することですzip

(l, l.tail).zipped.map( _ dist _ ).sum
于 2012-10-31T16:11:27.957 に答える