Уменьшение Scala с не примитивными списками - PullRequest
0 голосов
/ 22 мая 2018

Следующая функция вычисляет евклидово расстояние между двумя 2D-точками в Scala:

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 голосов
/ 22 мая 2018

Что с этим:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...