Trong chức năng tham số hóa này, tại sao tôi cần dàn diễn viên? Và làm thế nào tôi có thể loại bỏ nó?Trong hàm Scala được tham số hóa này, tại sao tôi cần dàn diễn viên?
/** Filters `xs` to have only every nth element.
*/
def everyNth[A <% Iterable[B], B](xs: A, n: Int, offset: Int = 0): A =
(xs.zipWithIndex collect { case (x, i) if (i - offset) % n == 0 => x }).asInstanceOf[A]
Nếu tôi không có dàn diễn viên cuối cùng, tôi nhận được thông báo lỗi này:
type mismatch; found : Iterable[B] required: A
Chức năng này (với các diễn viên) làm việc cho tất cả các trường hợp tôi đã thử nó trên và tôi biết từ việc nhập những thứ như sau tại REPL rằng Scala có thể suy ra loại kết quả chính xác khi không ở trong ngữ cảnh của hàm được tham số:
scala> val a: Stream[Int] = (Stream.from(0).zipWithIndex collect { case (x, i) if (i + 3) % 5 == 0 => x })
a: Stream[Int] = Stream(2, ?)
scala> a take 10 force
res20: scala.collection.immutable.Stream[Int] = Stream(2, 7, 12, 17, 22, 27, 32, 37, 42, 47)
Vui lòng giải thích!
Câu hỏi tương tự sử dụng 'CanBuildFrom' để khắc phục sự cố: [Hàm tổng quát có kiểu và trả về cùng loại] (http://stackoverflow.com/questions/10019529/function-which-generically-takes- a-type-and-returns-the-same-type). Tôi không thể làm cho nó để làm việc với câu hỏi này, một người nào khác? – sschaef
Tôi nhận CanBuildFrom để làm việc cho câu hỏi của mình và đưa giải pháp vào câu trả lời. Xem câu trả lời dưới đây nếu bạn tò mò. – Douglas
Câu trả lời hay! Btw, bạn có thể chấp nhận câu trả lời của riêng bạn ... – sschaef