Nói rằng tôi có một phương pháp có thể biến một (chức năng trên hai yếu tố) vào một (chức năng trên hai trình tự):Loại suy luận về chức năng ẩn danh với phong phú thêm-my-thư viện
def seqed[T](f: (T,T) => T): (Seq[T], Seq[T]) => Seq[T] = (_,_).zipped map f
Nói cách, chức năng kết quả mất hai chuỗi xs
và ys
, và tạo ra một chuỗi mới gồm (xs(0) f ys(0), xs(1) f ys(1), ...)
vì vậy, ví dụ, nếu xss
là Seq(Seq(1,2),Seq(3,4))
và f
là (a: Int, b: Int) => a + b
, chúng ta có thể gọi nó như vậy:
xss reduceLeft seqed(f) // Seq(4, 6)
hoặc với một chức năng ẩn danh:
xss reduceLeft seqed[Int](_+_)
này là khá tốt; nó sẽ là tốt đẹp để loại bỏ các đối số loại [Int]
nhưng tôi không thấy làm thế nào (bất kỳ ý tưởng?).
Để làm cho nó cảm thấy một chút giống như phương pháp tupled
, tôi cũng đã cố gắng mô hình phong phú thêm-my-thư viện:
class SeqFunction[T](f: (T,T) => T) {
def seqed: (Seq[T], Seq[T]) => Seq[T] = (_,_).zipped map f
}
implicit def seqFunction[T](f: (T,T) => T) = new SeqFunction(f)
Đối với một chức năng được xác định trước điều này làm việc tuyệt vời, nhưng nó xấu xí với những người ẩn danh
xss reduceLeft f.seqed
xss reduceLeft ((_:Int) + (_:Int)).seqed
có một cách khác để tôi có thể tái cấu trúc này để các loại được suy ra, và tôi có thể sử dụng cái gì cú pháp như sau:
// pseudocode
xss reduceLeft (_+_).seqed // ... or failing that
xss reduceLeft (_+_).seqed[Int]
? Hay tôi hỏi quá nhiều suy luận kiểu?
[Ở đây] (http://screencasts.chariotsolutions.com/uncovering-the-unknown-principles-of-type-inference-) Daniel Spiewak đã trình bày về các loại hệ thống và kiểu suy luận trong 'scala' và tĩnh khác ngôn ngữ đã nhập. Có lẽ đó không phải là chính xác về chủ đề, nhưng dù sao, tôi thấy nó cực kỳ thú vị. – 4e6