【问题标题】:Add two tuples containing simple elements in Scala在 Scala 中添加两个包含简单元素的元组
【发布时间】:2013-10-26 12:39:02
【问题描述】:

有没有一种简单的方法来添加包含可添加元素(如 Int、Doubles 等)的元组? 例如,

(1,2) + (1,3) = (2,5)

【问题讨论】:

  • 你想达到什么目的?主要使用元组来处理(可能)被认为是不好的风格。
  • 元组不适用于这种类型的东西。它们只是返回多个值的方法的便捷包装器,这就是为什么它们没有像集合那样的大量有用函数。
  • 我试图减少元组列表。我正在使用元组来做一些 map reduce 类型的操作。海关类和对象似乎有点矫枉过正。
  • @Arun,如果您正在使用元组列表,您可能会发现(我的)项目 github.com/marklister/product-collections 很有用。

标签: scala tuples


【解决方案1】:

Scalaz

import scalaz._, Scalaz._

scala> (1, 2.5) |+| (3, 4.4)
res0: (Int, Double) = (4,6.9)

对于任何类 A 都有一个运算符 |+|,范围内有隐式 Semigroup[A]Int |+| 默认为 +(您可以在代码中重新定义)。

如果AB 存在隐式Semigroup,则所有元组都有一个隐式Semigroup[(A, B)]

Scalaz cheat sheet

【讨论】:

    【解决方案2】:

    Scalaz 答案+1 :-)

    如果你想要一个非常简单的版本,你可以定义一个隐式类,如:

    implicit class TuppleAdd(t: (Int, Int)) {
      def +(p: (Int, Int)) = (p._1 + t._1, p._2 + t._2)
    }
    
    (1, 1) + (2, 2) == (3, 3)
    

    // update1,更通用的数字版本:

    所以这是最简单的版本,仅为Ints 定义,我们可以使用Scala 的Numeric 为所有数值生成它:

    implicit class Tupple2Add[A : Numeric, B : Numeric](t: (A, B)) {
      import Numeric.Implicits._
    
      def + (p: (A, B)) = (p._1 + t._1, p._2 + t._2)
    }
    
    (2.0, 1) + (1.0, 2) == (3.0, 3)
    

    【讨论】:

    • 问题中不仅有Int。您可以使用math.Numeric 改进您的答案,如下所示:implicit class TuppleAdd[A : Numeric, B : Numeric](t: (A, B)) { import Numeric.Implicits._; def +(p: (A, B)) = (p._1 + t._1, p._2 + t._2) }
    • 是的 :-) 我也想过一个有结构类型的版本,但我们可能不会去那里 ;-)
    • 我也尝试过实现implicit def tupleIsNumeric[A : Numeric, B : Numeric]: Numeric[(A, B)],但是有an issue+ 运算符(-* 工作正常)。
    • 您的+ 问题可能与此有关吗?:stackoverflow.com/questions/6906742/…
    【解决方案3】:

    这也适用于Cats,类似于scalaz 答案:

    > (1,2) |+| (1,3)
    res3: (Int, Int) = (2, 5)
    

    同样,它依赖于Semigroup

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 2014-05-02
      • 2020-07-04
      • 1970-01-01
      • 2020-02-17
      相关资源
      最近更新 更多