【发布时间】:2017-08-24 20:49:12
【问题描述】:
我想在元组上使用一些函数,它返回只有第一个元素转换而其他元素不变的元组。
这是 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)
虽然感觉不是原生的,但我想要的是这样写:
(1, 2).mapFirst(_ * 5)
然后我写了隐式转换:
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)
然后,当我只想在 Tuple3 上映射第二个元素或第一个元素时,我将不得不再次编写相同的样板。是否有一些内置了此类方法的库?
【问题讨论】:
-
可能想要使用 Shapeless 及其 Lenses 实现。