非基元列表的Scala约简

非基元列表的Scala约简,scala,list,function,Scala,List,Function,以下函数计算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), Li

以下函数计算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:
Name:未知错误
消息::43:错误:类型不匹配;
找到:(List[Double],List[Double])=>Double
必需:(任意,列表[双]=>任意
arr.reduceLeft(欧几里德)
^
:43:错误:类型不匹配;
发现:有吗
所需:双人
arr.reduceLeft(欧几里德)
^
堆栈跟踪:
我可以使用for循环执行命令式操作,但我想知道是否可以用Scala的方式更简单地解决这个问题。

这是怎么回事:

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

def周长(ListBuffer[List[Double]]:arr)
不应该是
def周长(arr:ListBuffer[List[Double]])
?@RameshMaharjan:Yup。在SO中重构时出错。刚刚做了编辑。(尽管错误仍然相同:))来自
def滑动(size:Int):迭代器[Seq[A]]通过在固定大小的块上传递一个“滑动窗口”对元素进行分组(而不是像在分组中那样对它们进行分区)。“滑动窗口”步骤设置为一。
arr.sliding(2)。toList
res1:List[List[Int]]=List(列表(列表(0,0),列表(0,1)),列表(列表(0,1),列表(1,1)),列表(列表(1,1),列表(1,0),列表(列表(1,0),列表(0,0))
滑动将元素作为两个元素列表返回。因此,您可以通过模式匹配
案例列表(a,b)
map(l match{case List(a,b)=>}的合成糖