Он находится в ScalaDoc, но без большой документации. Кажется, что он всегда возвращает первый параметр.
Function.const(1)(2)
, например, возвращает 1
.
Почему он существует и почему он полезен?
Он находится в ScalaDoc, но без большой документации. Кажется, что он всегда возвращает первый параметр.
Function.const(1)(2)
, например, возвращает 1
.
Почему он существует и почему он полезен?
Чтобы дать более теоретический ответ: const - это комбинатор K исчисление SKI. Иногда он появляется, когда вы работаете с довольно абстрактными понятиями, где вам не так много "работать". Рассмотрим характер (Хаскеллский стиль) Характеристика функтора:
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 должен быть абстрактным, поскольку он является самой сутью функтора. Но мы можем написать общую реализацию слева, и здесь нам понадобится 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
Как вы видите, слева делает то, что нужно (обертывание значения в каком-то функторе, когда у нас уже есть "ролевая модель" или "шаблон" для этого функтора во втором аргументе). Определить его очень абстрактно, не зная ничего о функторе, было возможно только с помощью const.
Он полезен для передачи в качестве аргумента функции более высокого порядка. Например, чтобы заменить все элементы списка одним и тем же элементом:
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)
В зависимости от контекста, может быть более читаемым, чем другой.