Function.const的目的是什么?

soc*_*soc 17 parameters scala const function library-design

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

Function.const(1)(2)例如返回1.

它为什么存在,为什么有用?

ham*_*mar 26

它作为参数传递给高阶函数很有用.例如,要用相同的元素替换列表的所有元素:

scala> List(1, 2, 3, 4, 5).map(Function.const(7))
res1: List[Int] = List(7, 7, 7, 7, 7)
Run Code Online (Sandbox Code Playgroud)

你当然也可以写

scala> List(1, 2, 3, 4, 5).map(_ => 7)
res2: List[Int] = List(7, 7, 7, 7, 7)
Run Code Online (Sandbox Code Playgroud)

根据上下文,一个可能比另一个更可读.


Lan*_*dei 19

为了给出一个更理论的答案: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] 
}
Run Code Online (Sandbox Code Playgroud)

现在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)
}
Run Code Online (Sandbox Code Playgroud)

使用选项测试:

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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样做它应该做什么(当我们在第二个参数中已经为这个仿函数设置了"角色模型"或"模式"时,将值包含在某个仿函数中).只有使用const才能定义它非常抽象而不知道任何类型的仿函数.