Tôi cần kiểm tra lại (vui lòng).Làm thế nào để chuyên đối số tham số kiểu cho nhiều loại khác nhau cho trong Scala?
Trong một bài viết (http://www.win-vector.com/blog/2010/06/automatic-differentiation-with-scala/) Tôi vừa viết tôi đã nói rằng đó là niềm tin của tôi trong Scala rằng bạn không thể chỉ định một hàm nhận một đối số mà chính nó là một hàm có tham số kiểu không ràng buộc. Tôi đã chỉnh sửa câu hỏi này để thử và đơn giản hóa ví dụ.
Các mã sau hoạt động bằng cách giới thiệu một đặc điểm GenericFn mà bắt chước các đặc điểm Scala Function1, ngoại trừ nó có một tham số tự do gõ vào chức năng:
object TypeExample {
trait NumberBase {
def result:String
}
class A extends NumberBase {
def result = "A"
}
class B extends NumberBase {
def result = "B"
}
trait GenericFn {
def apply[X<:NumberBase](x:X):String
}
def specializeAndApplyTwice(f:GenericFn):String = {
f[A](new A()) + f[B](new B())
}
def main(args : Array[String]) : Unit = {
val f = new GenericFn {
def apply[X<:NumberBase](x:X):String = { x.result }
}
println(specializeAndApplyTwice(f))
}
}
này hoạt động, nhưng có một cách để làm điều này mà không có đặc tính GenericFn (sử dụng ký pháp hàm chuẩn)? Ví dụ đoạn code dưới đây không thành công với các lỗi thời gian biên dịch: "loại không phù hợp; tìm thấy: TypeExample2.A yêu cầu: _ $ 1 nơi loại _ $ 1 <: TypeExample2.NumberBase":
def specializeAndApplyTwice(f:(_<:NumberBase)=>String):String = {
f(new A()) + f(new B())
}
Ví dụ của bạn có thể là: def g (f: Array [Double] => Double, x: Array [Double]): Double –
... và có lẽ, exampe thứ hai phải là def g (f [Y] : Mảng [Y] => Y, x: Mảng [Y]): Y? Nếu không, bạn có thể viết def g (f: Array [_] => Double, x: Array [Double]): Double, nhưng tôi cho rằng đây không phải là thứ bạn muốn. –
Arjan, thực ra các ví dụ của tôi gần hơn với những gì tôi muốn. Trong mã thực tế của tôi Y có một ràng buộc kiểu (mà tôi không tái tạo ở đây) của biểu mẫu Y <: NumberBase [Y] và NumberBase [Y] khai báo các phương thức để chuyển đổi và từ Y và Doubles. g() sử dụng cấu trúc này để chuyển đổi lên từ máy Doubles thành Ys, làm một số công việc và sau đó chuyển đổi xuống thành Doubles (vì vậy mã bên ngoài không chọn kiểu của Y và không cần xử lý kiểu của Y). – jmount