使用非基元列表减少Scala

时间:2018-05-22 09:41:40

标签: scala list function

以下函数计算Scala中两个2D点之间的欧几里德距离:

def euclideanDist(pt1: List[Double], pt2: List[Double]): Double =
  sqrt(pow(pt1(0)-pt2(0), 2)+pow(pt1(1)-pt2(1), 2))

我想设计一个周边函数来累积点列表(或ListBuffer)中每个连续点之间的距离。

例如

val arr:ListBuffer[List[Double]] = ListBuffer(List(0, 0), List(0,1), List(1,1), List(1,0), List(0, 0))
perimeter(arr)

应该将输出设为4。

这就是我的尝试:

def perimeter(arr: ListBuffer[List[Double]]): Double = 
  arr.reduceLeft(euclideanDist)

执行时,编译器抛出此错误

Name: Unknown Error
Message: <console>:43: error: type mismatch;
 found   : (List[Double], List[Double]) => Double
 required: (Any, List[Double]) => Any
         arr.reduceLeft(euclideanDist)
                        ^
<console>:43: error: type mismatch;
 found   : Any
 required: Double
         arr.reduceLeft(euclideanDist)
                       ^
StackTrace:

我可以强制执行并使用for循环执行整个操作,但是想知道这是否可以用Scala方式更简单地解决。

1 个答案:

答案 0 :(得分:2)

这是什么:

val arr:List[List[Double]] = List(List(0, 0), List(0,1), List(1,1), List(1,0), List(0, 0))

arr.sliding(2).map{case List(a,b) => euclideanDist(a,b)}.sum