在Scala what';检查数组是否单调的函数方法是什么?

在Scala what';检查数组是否单调的函数方法是什么?,scala,Scala,我有一个数组valx:array[Double],并希望检查每个x(I)可以使用的函数的先决条件: 考虑这一点: def isMonotonic(arr:Array[Int]) = if (arr.isEmpty) true else (arr, arr.tail).zipped.forall {case (a,b) => a <= b} def ismononic(arr:Array[Int])= 如果(arr.isEmpty)为真 else(arr,arr.tai

我有一个数组
valx:array[Double]
,并希望检查每个
x(I)可以使用的函数的先决条件:

考虑这一点:

def isMonotonic(arr:Array[Int]) = 
   if (arr.isEmpty) true
   else (arr, arr.tail).zipped.forall {case (a,b) => a <= b}
def ismononic(arr:Array[Int])=
如果(arr.isEmpty)为真

else(arr,arr.tail).zipped.forall{case(a,b)=>a有几个好的答案可供选择,下一个问题是:我们能让它通用吗

这是我的机会

def isMonotonic[T](ts: Traversable[T])(implicit ev: Ordering[T]): Boolean = {
  if (ts.size < 2) true
  else if (ev.gt(ts.head, ts.tail.head)) false
  else isMonotonic(ts.tail)
}

略为不同的方法

def isMonotonic(xs:List[Int]) = xs.sliding(2)
                                  .collectFirst{case List(x,y) if x > y => 1}
                                  .isEmpty

适用于空列表和长度为1的列表,因为从未在这些列表上定义过分部函数。因为它是
collectFirst
,所以在第一个证据出现时它会退出
xs-zip-xs.drop(1)
如果愿意,可以使用idea

在Haskell中,您可以使用
zip
一个列表,这样您就可以获得相邻元素对。不确定它在Scala中是否优雅。为什么带有while循环的简单的旧“def ismononic(…)”是“不合法的”?不必使用那些低效的拉链/滑动来实现“功能性”。只要你的函数是纯的,就可以。实用性应该是目标,而不是“优雅”。OK删除了优雅一词..我对函数形式解决方案感兴趣。函数对我来说是优雅的原因可能是个人原因,但我想这与更好的意图沟通有关=elegance@Bergi
(vs,vs.view.drop(1)).zipped.forall(
。视图只管理索引,而压缩的
不构建任何东西。可能更像
案例x::y::
?@Bergi肯定更优雅。
:::
?这是怎么发生的?@jwvh如果列表的尾部存在,它会忽略它,不是吗?我看到它在REPL中工作。但这是我的问题。怎么可能有尾巴吗?怎么会有什么可以忽略的?避免中间集合:
(vs,vs.view.drop(1)).zipped.forall(
)vs.view.drop(1)等同于vs.view.tail吗?我更希望第二个解决方案变得更简单,谢谢@som snytt!
def isMonotonic(arr:Array[Int]) = 
   (arr, arr.drop(1)).zipped.forall (_ <= _)
def isMonotonic[T](ts: Traversable[T])(implicit ev: Ordering[T]): Boolean = {
  if (ts.size < 2) true
  else if (ev.gt(ts.head, ts.tail.head)) false
  else isMonotonic(ts.tail)
}
isMonotonic(Array('c','a','z'))             // false
isMonotonic(Vector(3.1, 2.2, 7.7))          // false
isMonotonic(List[Int]())                    // true
isMonotonic(Seq("abc", "bcb", "tz", "xs"))  // true
def isMonotonic(xs:List[Int]) = xs.sliding(2)
                                  .collectFirst{case List(x,y) if x > y => 1}
                                  .isEmpty