2011-05-08 25 views

Respuesta

17

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.

21

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.

Cuestiones relacionadas