我正在搞Scala 2.8的乐趣,并试图定义一个pimp增加了”as“方法来键入构造函数,允许从一个函子转换到另一个(请忽略这个事实,我不一定在这里处理仿函数)。因此,例如,你可以使用这样的:”不能存在抽象的参数化类型...“
val array:Array[T]
val list:List[T] = array.as[List]
所以这里就是我试图做的:
object Test {
abstract class NatTrans[F[_], G[_]] {
def convert[T](f:F[T]):G[T]
}
implicit def array2List:NatTrans[Array, List] = new NatTrans[Array, List] {
def convert[T](a:Array[T]) = a.toList
}
// this next part gets flagged with an error
implicit def naturalTransformations[T, F[_]](f:F[T]) = new {
def as[G[_]](implicit n:NatTrans[F, G]) = n convert f
}
}
然而naturalTransformations
定义将被标记错误“不可能存在性抽象超过参数化类型G [T]“。为了解决这个问题,我可以重写naturalTransformations
有一个附加的类Transformable
一起,像这样:
class Transformable[T, F[_]](f:F[T]) {
def as[G[_]](implicit n:NatTrans[F, G]) = n convert f
}
implicit def naturalTransformations[T, F[_]](f:F[T]) = new Transformable[T, F](f)
,它似乎工作。但似乎我的第一次尝试应该是相同的,所以我很好奇它为什么失败以及错误消息的含义。
我已经习惯了在类似情况下看到错误“结构细化中的参数类型可能不涉及在该细化之外定义的抽象类型”。这种限制与结构类型在JVM上用反射IIRC实现的方式有关。 http://stackoverflow.com/questions/2685804/scala-parameter-type-in-structural-refinement-may-not-refer-to-an-abstract-type – retronym 2010-06-26 06:30:23