【问题标题】:Scala: normal functions vs tupled functions?Scala:普通函数与元组函数?
【发布时间】:2012-01-08 14:24:08
【问题描述】:

这些有什么区别?我知道它们的类型签名是不同的,并且所有函数都正常启动并且必须是 .tupled 才能获得它们的元组形式。使用非元组(但非柯里化)函数有什么好处?特别是因为在我看来,将多个参数传递给元组函数会自动解包它们,所以从所有外观来看它们都是相同的。

我看到的一个区别是,它强制您为每个数量的函数参数都有类型:Function0Function1Function2Function3 等,而元组函数都只是 Function1[A, R],但是这似乎是一个缺点。使用默认的非元组函数的最大优势是什么?

【问题讨论】:

    标签: function generics scala types tuples


    【解决方案1】:

    元组函数要求在调用它们时创建一个元组对象(除非参数恰好已经被打包到一个元组中)。非元组函数只是定义一个采用适当数量参数的方法。因此,给定 JVM 架构,非元组函数更有效。

    【讨论】:

      【解决方案2】:

      考虑这个例子:

      scala> def mult = (x: Int, y: Int) => x * y
      mult: (Int, Int) => Int
      
      scala> val list = List(1, 2, 3)
      list: List[Int] = List(1, 2, 3)
      
      scala> list zip list map mult
      <console>:10: error: type mismatch;
       found   : (Int, Int) => Int
       required: ((Int, Int)) => ?
                    list zip list map mult
                                      ^
      
      scala> list zip list map mult.tupled
      res4: List[Int] = List(1, 4, 9)
      

      在很多情况下,您最终会在元组中配对元素。在这种情况下,您需要一个元组函数来处理它。但还有很多其他地方是真的!例如:

      scala> list.foldLeft(1)(mult)
      res5: Int = 6
      
      scala> list.foldLeft(1)(mult.tupled)
      <console>:10: error: type mismatch;
       found   : ((Int, Int)) => Int
       required: (Int, Int) => Int
                    list.foldLeft(1)(mult.tupled)
                                          ^
      

      因此,基本上,Scala 在元组和参数之间存在二分法,这意味着您必须将函数从元组转换为非元组,反之亦然。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-17
        • 1970-01-01
        相关资源
        最近更新 更多