隐式地图,或类似的东西

时间:2013-05-01 14:38:13

标签: scala

这是我到目前为止所拥有的。我想要实现的是使容器的行为与它们包含的类型相同。

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]的方法,而不是。

我需要提取方法名称,查看范围内是否有可以应用于基础类型的名称的函数,然后使用隐式定义将其解除。

或许可以使用类型构造函数来完成,该类型构造函数将以某种方式在实例化上扫描基础类型,并定义正确的方法。

两者都是非常难看的解决方案,我甚至不确定它们是否可行。有没有其他方法可以实现我想要的,这不涉及明确地编写所有方法?

1 个答案:

答案 0 :(得分:1)

你看过Dynamics了吗?结合标准的Java Reflection,这可以解决您的问题。我不知道IDE中的内容辅助是否会因此而感到困惑,但是......