通常在列表中查找最大项目

Kev*_*ith 0 haskell scala max

在Haskell中,我写了一个函数,给定a List of a,返回Maybe a.

max' :: Ord a => [a] -> Maybe a
max' []     = Nothing
max' (x:xs) = Just $ foldr (\y acc -> if (y > acc) then y else acc) x xs
Run Code Online (Sandbox Code Playgroud)

我怎么能在Scala中写这个?我不确定OrdScala 中的等价物.

mpi*_*ist 8

你可以使用scalaz.Orderscala.math.Ordering:

使用Scalaz:

def max[A](as: List[A])(implicit ord: Order[A]): Option[A] =
  as.foldLeft(None: Option[A]) {
    case (None, a) => Some(a)
    case (s @ Some(m), a) => if (ord.greaterThanOrEqual(m, a)) s else Some(a)
  }
Run Code Online (Sandbox Code Playgroud)

无:

def max[A](as: List[A])(implicit ord: math.Ordering[A]): Option[A] =
  as.foldLeft(None: Option[A]) {
    case (None, a) => Some(a)
    case (s @ Some(m), a) => if (ord.gteq(m, a)) s else Some(a)
  }
Run Code Online (Sandbox Code Playgroud)

请注意,Scalaz def maximum: Option[A]为所有Foldable实例定义:

scala> import scalaz.syntax.foldable._
import scalaz.syntax.foldable._

scala> import scalaz.std.AllInstances._
import scalaz.std.AllInstances._

scala> List(1, 2, 3).maximum
res0: Option[Int] = Some(3)
Run Code Online (Sandbox Code Playgroud)

标准库def max: A为所有集合定义,但它不安全:

scala> (Nil: List[Int]).max
java.lang.UnsupportedOperationException: empty.max
...
Run Code Online (Sandbox Code Playgroud)