在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 中的等价物.
你可以使用scalaz.Order或scala.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)