Scala:映射元组中的第一个元素

Evg*_*kov 3 scala tuples

我想在元组上使用一些函数,它返回元组只有第一个元素被转换而其他元素没有变化.

这是Tuple2的天真版本:

def mapFirst[T, U, R](tuple: (T, U))(f: T => R): (R, U) = tuple match {
     |   case (x, y) => f(x) -> y
     | }

mapFirst((1, 2))(_ * 5) // returns (5, 2)
Run Code Online (Sandbox Code Playgroud)

虽然,它不觉得原生,我想要的是这样写:

(1, 2).mapFirst(_ * 5)
Run Code Online (Sandbox Code Playgroud)

我写了隐式转换然后:

class RichTuple[T, U](tuple: (T, U)) {
  def mapFirst[R](f: T => R): (R, U) = tuple match {
    case (x, y) => f(x) -> y
  }
}

implicit def tuple2RichTuple[T, U](tuple: (T, U)): RichTuple[T, U] = new RichTuple(tuple)

(1, 2).mapFirst(_ * 5)
Run Code Online (Sandbox Code Playgroud)

然后,当我想要在Tuple3上映射第二个元素或第一个元素时,我将不得不再次编写相同的样板文件.是否有一些库内置了这样的方法?

Arn*_*-Oz 7

您可以使用无形元组函数:

import shapeless._
import syntax.std.tuple._
val x=(1,2,3)
val y=x.updatedAt(0,x.head*5)
// y= (5,2,3)
Run Code Online (Sandbox Code Playgroud)