Tôi đã rối tung xung quanh với Scala 2.8 cho vui và cố gắng xác định pimp, thêm phương thức "as" để nhập các nhà xây dựng, cho phép chuyển đổi từ một hàm này sang hàm khác (xin vui lòng bỏ qua một thực tế là tôi không nhất thiết phải đối phó với các functors ở đây). Vì vậy, ví dụ, bạn có thể sử dụng nó như thế này:"không thể tồn tại trừu tượng trên kiểu tham số ..."
val array:Array[T]
val list:List[T] = array.as[List]
Vì vậy, đây là những gì tôi đã cố gắng để làm:
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
}
}
tuy nhiên định nghĩa của naturalTransformations
được đánh dấu với lỗi "không thể existentially trừu tượng trên loại tham số G [T] ". Để khắc phục điều này, tôi có thể viết lại naturalTransformations
cùng với một lớp học thêm Transformable
như vậy:
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)
và nó xuất hiện để làm việc. Nhưng có vẻ như nỗ lực đầu tiên của tôi nên tương đương, vì vậy tôi tò mò tại sao nó thất bại và thông báo lỗi có nghĩa là gì.
Tôi thường thấy lỗi "Loại thông số trong sàng lọc cấu trúc có thể không đề cập đến một loại trừu tượng được xác định bên ngoài sàng lọc" trong các tình huống tương tự. Sự hạn chế đó liên quan đến cách các kiểu cấu trúc được thực hiện trên JVM với sự phản chiếu, IIRC. http://stackoverflow.com/questions/2685804/scala-parameter-type-in-structural-refinement-may-not-refer-to-an-abstract-type – retronym