这是我到目前为止所拥有的。我想要实现的是使容器的行为与它们包含的类型相同。
implicit def transformer[T, A](f: T => A)
: List[T] => List[A] =
t => t map f
implicit def combiner[T, U, A](f: (T, U) => A)
: (List[T], List[U]) => List[A] =
(t , u ) => t zip u map { x => f(x._1, x._2) }
val x = List(1, 2, 3)
val f: Int => Int = (_ + 1)
val fx = f(x) // fx = List(2,3,4)
val g: (Int, Int) => Int = (_ + _)
val gxx = g(x, x) // gxx = List(2,4,6)
现在,这就像我想要的功能一样。但我的方法有问题。例如,这显然不起作用:
val double = x + x
这不起作用,因为+必须是List [Int]的方法,而不是。
我需要提取方法名称,查看范围内是否有可以应用于基础类型的名称的函数,然后使用隐式定义将其解除。
或许可以使用类型构造函数来完成,该类型构造函数将以某种方式在实例化上扫描基础类型,并定义正确的方法。
两者都是非常难看的解决方案,我甚至不确定它们是否可行。有没有其他方法可以实现我想要的,这不涉及明确地编写所有方法?