【问题标题】:What's the purpose of Function.const?Function.const 的目的是什么?
【发布时间】:2011-08-20 23:01:10
【问题描述】:

它位于ScalaDoc,但没有太多文档。好像总是返回第一个参数。

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

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

【问题讨论】:

    标签: function scala parameters constants library-design


    【解决方案1】:

    给出一个更理论的答案:const 是SKI calculus 的 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] 
    }
    

    现在 fmap 需要是抽象的,因为它是函子的本质。但是我们可以写一个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
    

    正如你所看到的,left 做了它应该做的(当我们在第二个参数中已经有了这个函子的“角色模型”或“模式”时,将一个值包装在某个函子中)。只有使用 const 才能在不了解仿函数类型的情况下非常抽象地定义它。

    【讨论】:

      【解决方案2】:

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

      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)
      

      根据上下文,一个可能比另一个更具可读性。

      【讨论】:

        猜你喜欢
        • 2011-03-05
        • 2015-03-21
        • 1970-01-01
        • 1970-01-01
        • 2019-07-14
        • 2018-11-04
        • 2015-01-17
        • 2021-11-05
        • 2011-09-26
        相关资源
        最近更新 更多