我正在搞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