在Scala中实现个案类型级别函数

时间:2013-09-29 08:38:25

标签: scala metaprogramming typeclass scala-2.10 scala-macros

我想实现一些东西,可能是宏,来实现像

这样的东西
Int --> java.lang.Integer
Float --> java.lang.Float

这样我就可以实现像

这样的东西
def box[X <: AnyVal : Numeric](x: X) : Boxed[X] = ...

在实例化时会导致Boxed[Int]成为java.lang.Integer。 我并不太关心具体的语法或实现方法 只要我可以编写可以对类型执行ad hoc映射的泛型方法和类 像上面一样。 我知道Scala库已经有像int2Integer这样的装箱用于装箱和拆箱, 但我需要以编译器可以检查的方式显式映射类型。 这主要用于实现类型类,其实例具有依赖于类型参数但以非参数方式的类型成员。 目前我在类型类的每个实例中显式定义此类型成员, 而不是从类型参数计算它,而是将样板添加到所有实例

修改

以上功能只是一个例子。我真的在写类型课,我需要说一下:

trait Mapping[T, U] {
   type MapBase = java.util.Map[Box[T], Box[U]]
   type MapType <: MapBase
   def create : MapType
   ...
}

Box [T]的行为如上所述。这旨在与专门的Java集合库(如FastUtil&amp; amp; amp; amp;宝库。类型类的实例会将MapType实例化为专用类,以便

隐式对象LongIntMapping扩展Mapping [Long,Int] {       类型MapType = Int2LongOpenHashMap       def create:MapType = ...    }

应自动获取MapBase = Map[java.lang.Long, Java.lang.Integer],因为这就是FastUtil Int2LongOpenHashMap实现的接口,即使它存储未装箱的基元。这是FastUtil中的一般模式:本机类型的集合为相应的盒装类型实现Java集合接口,这是我试图系统地实现的概念。当然,这仍然需要我想要使用的每个FastUtil集合的类型类实例。我也looking进入宏来解决/减少这个问题。 Mybe宏甚至可以避免使用类型类,但是生产代码和宏是实验性的......

0 个答案:

没有答案