Está en ScalaDoc pero sin mucha documentación. Parece que siempre devuelve el primer parámetro.¿Cuál es el propósito de Function.const?
Function.const(1)(2)
por ejemplo, devuelve 1
.
¿Por qué existe y por qué es útil?
Está en ScalaDoc pero sin mucha documentación. Parece que siempre devuelve el primer parámetro.¿Cuál es el propósito de Function.const?
Function.const(1)(2)
por ejemplo, devuelve 1
.
¿Por qué existe y por qué es útil?
Para dar una respuesta más teórica: const es el combinador K del SKI calculus. A veces aparece cuando trabajas con conceptos bastante abstractos donde no tienes mucho "con qué trabajar". Considere un (Haskell estilo) Functor rasgo:
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]
}
necesidades Ahora FMAP para ser abstracto, ya que es la esencia misma de un funtor. Sin embargo, podemos escribir una aplicación general de la izquierda, y aquí tenemos que 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)
}
prueba con Opción:
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
Como se puede ver a la izquierda hace lo que debe (envolviendo un valor de alguna funtor cuando ya tenemos un "modelo a seguir" o "patrón" para este funtor en el segundo argumento). Definirlo muy abstracto sin saber nada sobre el tipo de functor solo fue posible usando const.
Es útil para pasar como argumento a una función de orden superior. Por ejemplo, para reemplazar todos los elementos de una lista con el mismo elemento:
scala> List(1, 2, 3, 4, 5).map(Function.const(7))
res1: List[Int] = List(7, 7, 7, 7, 7)
Se podría, por supuesto, también escribir
scala> List(1, 2, 3, 4, 5).map(_ => 7)
res2: List[Int] = List(7, 7, 7, 7, 7)
Dependiendo del contexto, uno puede ser más fácil de leer que el otro.