2014-04-28 84 views
4

如果我有一个隐含从AB,我该如何从F[A]F[B]自动获取隐含?斯卡拉隐式发电机

例如,如果我有implicit toInt[A](l: List[A]) = l.size,现在我想隐含从(List[A], Int)(Int, Int),它们重复使用了隐含的toInt。这在斯卡拉甚至可能吗?

+0

只有'列表[T]'或者任何集合/仿函数? –

+0

我刚刚使用'List [T]'作为例子。所以,是的,任何functor .. – pathikrit

+0

顺便说一句'List [A] => Int'转换看起来*真*臭...我不会在我的代码中使用这样的东西。 –

回答

4

含义可以使用其他含义来转换值。所以给你的toInt

implicit def toInt[A](l: List[A]): Int = l.size 

我们可以定义为第一元素转换为2元组来Int的隐式转换,例如(List[Int], Int)(Int, Int)

implicit def tupleConvert[A <% Int, C](x: (A, C)): (Int, C) = (x._1, x._2) 

A <% Int声明结合的视图,要求从A一个隐式转换到Int在主叫范围是可用的。

它可能看起来像以下是可能的:

implicit def tupleConvert2[A <% B, B, C](x: (A, C)): (B, C) = (x._1, x._2) 

让我们(A, C)类型的任何2元组转换为(B, C)给从AB转换。但是,由于Scala解析类型参数的方式,这不起作用*。

*(我认为这可能是一个错误,它看起来很像SI-2046,这是SI-3340,这仍然是开放的副本)