0

这是我到目前为止所拥有的。我想要实现的是让容器表现得像它们所包含的类型。

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] 的一个方法,而事实并非如此。

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

或者,也许这可以通过类型构造函数来完成,该构造函数会以某种方式在实例化时扫描底层类型,并定义正确的方法。

两者都是相当丑陋的解决方案,我什至不确定它们是否可行。有没有其他方法可以实现我想要的,不涉及明确编写所有方法?

4

1 回答 1

1

你看过动态吗?结合标准 Java 反射,这可能会解决您的问题。我不知道 IDE 中的 Content Assist 是否对此感到困惑,不过......

于 2013-05-01T14:59:01.137 回答