2011-06-21 29 views
12

thể trùng lặp:
What do <:<, <%<, and =:= mean in Scala 2.8, and where are they documented?Không thể tìm ra những gì =: = [A, B] là viết tắt của

Tôi không hiểu những gì =: = [A, B] là viết tắt của nó và nó có thể hữu ích như thế nào. Tôi đã thực hiện một số nghiên cứu nhưng rất khó để tìm kiếm một cái gì đó mà không có ký tự chữ cái trong đó. Ai đó có thể giúp tôi với một ví dụ thực tế?

+1

Xin lỗi vì trùng lặp, nhưng một lần nữa, bạn không thể tìm kiếm chuỗi "=: =" ... – paradigmatic

Trả lời

11

Từ Scala 2,8 loại trở đi tham số đã được dành thậm chí khả năng hạn chế hơn thông qua các lớp học hạn chế loại khái quát hóa. Những lớp học cho phép chuyên môn hóa hơn nữa trong phương pháp, và bổ sung cho vọt bối cảnh, như sau:

A =: = B khẳng định rằng A và B phải được bình đẳng

Một <: < B khẳng định rằng A phải một subtype của B

Việc sử dụng mẫu của các lớp này sẽ cho phép chuyên môn bổ sung các phần tử số trong bộ sưu tập hoặc định dạng in riêng biệt hoặc cho phép tính toán trách nhiệm tùy chỉnh đối với các loại đặt cược hoặc quỹ cụ thể trong danh mục nhà giao dịch . Ví dụ:

case class PrintFormatter[T](item : T) { 
def formatString(implicit evidence: T =:= String) = { // Will only work for String PrintFormatters 
    println("STRING specialised printformatting...") 
} 
    def formatPrimitive(implicit evidence: T <:< AnyVal) = { // Will only work for Primitive PrintFormatters 
println("WRAPPED PRIMITIVE specialised printformatting...") 
} 
} 

val stringPrintFormatter = PrintFormatter("String to format...") 
stringPrintFormatter formatString 
// stringPrintFormatter formatPrimitive // Will not compile due to type mismatch 

val intPrintFormatter = PrintFormatter(123) 
intPrintFormatter formatPrimitive 
// intPrintFormatter formatString // Will not compile due to type mismatch 

Bạn có thể tìm một khóa học toàn bộ ngắn về Scala loại ở đây: http://scalabound.org/?p=323

+1

Làm thế nào là '<: <' khác với ':' sau đó? – ninjagecko

+2

@ninjagecko: 'a: A' xác nhận rằng _term_' a' có _type_ 'A' ... nó tương tự như" là một phần tử của "quan hệ (a ∈ A) trong lý thuyết tập hợp. 'A <:

4

Lớp =:=[A,B] là bằng chứng cho AB nuôi cùng lớp. Xem ví dụ http://apocalisp.wordpress.com/2010/06/10/type-level-programming-in-scala-part-2-implicitly-and/ để được giải thích.

Thật khó để tìm một số ví dụ. Dưới đây là một mã chút:

+2

Bạn có thể cho ví dụ về cách sử dụng nó không? – ziggystar

0

Điều tốt nhất để tìm hiểu là nhìn vào nguồn gốc của Predef. Ở đó bạn tìm thấy điều này:

object =:= { 
    implicit def tpEquals[A]: A =:= A = new (A =:= A) {def apply(x: A) = x} 
} 

Do đó đối tượng thuộc loại A =: = B chỉ có sẵn nếu A và B cùng loại.

+0

Nhưng đó là một đối tượng mà * sử dụng * lớp '=: = [A, A]'. Nó không giải thích những gì 'A =: = A' có nghĩa là. – Debilski

+0

Nó cho bạn biết làm thế nào trình biên dịch có thể nhận được một thể hiện của A =: = B ngầm, đó là điều duy nhất lớp được sử dụng cho. Lớp _only_ đóng vai trò là nhân chứng của thực tế là A bằng B. –

Các vấn đề liên quan