非基元列表的Scala约简
以下函数计算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
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)=>}的合成糖