2016-07-20 33 views
2

这是一个我正在考虑在Scala中使用的模式来定义合同,但不限制类型,但仍具有流畅的API,但没有所有详细的隐含性[..]。在Scala中输入类API

的想法是在一个类型的类之上构建一个隐含的类,像这样:

implicit class NumberLikeApi[N : NumberLike](n: N) 
    def add(n2: N): N = implicitely[NumberLike[N]].add(n, n2) 
} 

现在用的范围右implicits你可以这样做:

val sum = n1.add(n2) 

相反的:

val sum = implicitly[NumberLike[N]].add(n1, n2) 

我的问题:是否有可能自动化/生成隐式类部分?它基本上是类型类的重复。

我没有找到语言&标准库中的东西。图书馆里有没有宏可以做到这一点?

回答

3

simulacrum的用途应该就是这个。

从它的自述,你可以写

import simulacrum._ 

@typeclass trait Semigroup[A] { 
    @op("|+|") def append(x: A, y: A): A 
} 

,然后使用它像

// instance for Semigroup[Int] 
implicit val semigroupInt: Semigroup[Int] = new Semigroup[Int] { 
    def append(x: Int, y: Int) = x + y 
} 

import Semigroup.ops._ 

1 |+| 2 // 3 
+0

真棒!不知道这一个。以某种方式无法在我的搜索尝试中找到它。非常感谢,这使得模式有点可用。 –