它在ScalaDoc中,但没有太多文档。似乎它总是返回第一个参数。
Function.const(1)(2)
例如返回1
。
它为什么存在,为什么有用?
它对于作为参数传递给高阶函数很有用。例如,用相同的元素替换列表的所有元素:
scala> List(1, 2, 3, 4, 5).map(Function.const(7))
res1: List[Int] = List(7, 7, 7, 7, 7)
你当然也可以写
scala> List(1, 2, 3, 4, 5).map(_ => 7)
res2: List[Int] = List(7, 7, 7, 7, 7)
根据上下文,一个可能比另一个更具可读性。
给出一个更理论的答案: const 是SKI 演算的 K 组合子。当您使用没有太多“可使用”的非常抽象的概念时,它有时会弹出。考虑一个(Haskell 风格)Functor 特征:
trait Functor[F[_]] {
def fmap[A,B](f:A=>B, fa: F[A]):F[B]
//(<$) in Haskell
def left[A,B](a:A, fb:F[B]):F[A]
}
现在 fmap 需要是抽象的,因为它是函子的本质。但是我们可以写一个left的一般实现,这里我们需要const:
trait Functor[F[_]] {
def fmap[A,B](f:A=>B, fa: F[A]):F[B]
//(<$) in Haskell
def left[A,B](a:A, fb:F[B]):F[A] =
fmap(Function.const(a), fb)
}
使用选项进行测试:
case object OptionFunctor extends Functor[Option] {
def fmap[A,B] (f:A=>B, fa:Option[A]):Option[B] = fa match {
case Some(a) => Some(f(a))
case None => None
}
}
//left works:
OptionFunctor.left("test",Some(42))
//--> Option[java.lang.String] = Some(test)
OptionFunctor.left("test",None:Option[Int])
//--> Option[java.lang.String] = None
正如你所看到的,left 做了它应该做的事情(当我们在第二个参数中已经有了这个函子的“角色模型”或“模式”时,将一个值包装在某个函子中)。只有使用 const 才能在不知道函子类型的情况下非常抽象地定义它。