Function 什么';函数的目的是什么?

Function 什么';函数的目的是什么?,function,scala,parameters,constants,library-design,Function,Scala,Parameters,Constants,Library Design,它在中,但没有太多文档。它似乎总是返回第一个参数 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(_ =>

它在中,但没有太多文档。它似乎总是返回第一个参数

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是。当你处理一些抽象的概念,而你没有太多的“工作”时,它有时会弹出。考虑一个(Haskell型)函子特性:

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] 
}
正如您所看到的,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