2017-05-10 18 views
9

Câu hỏi này có thể được hỏi và trả lời trước đó, nhưng tôi muốn hiểu điều này với một ví dụ và tôi không thể lý giải ra mô hình Aux có thể hữu ích ở đâu! Vì vậy, đây là đặc điểm:Hiểu mô hình Aux trong Hệ thống Loại Scala

trait Foo[A] { 
    type B 
    def value: B 
} 

Tại sao tôi có loại liên kết với kiểu trả về của hàm giá trị? Tôi làm gì để đạt được điều này? Đặc biệt, tôi sẽ sử dụng các mẫu như thế nào?

+0

'loại B' hoạt động giống như A, chỉ tên được đặt tên và có thể được tham chiếu, trái với A. – pedrofurla

Trả lời

8

Hãy tưởng tượng một kiểu chữ để nhận phần tử cuối cùng của bất kỳ bộ dữ liệu nào.

trait Last[A] { 
    type B 
    def last(a: A): B 
} 

object Last { 
    type Aux[A,B0] = Last[A] { type B = B0 } 

    implicit def tuple1Last[A]: Aux[Tuple1[A],A] = new Last[Tuple1[A]] { 
    type B = A 
    def last(a: Tuple1[A]) = a._1 
    } 

    implicit def tuple2Last[A,C]: Aux[(A,C),C] = new Last[(A,C)] { 
    type B = C 
    def last(a: (A,C)) = a._2 
    } 

    ... 
} 

Loại B luôn phụ thuộc vào loại A, đó là lý do tại sao A là một loại đầu vào của typeclass và B là một loại sản lượng.

Bây giờ nếu bạn muốn một hàm có thể sắp xếp bất kỳ danh sách bộ dữ liệu nào dựa trên phần tử cuối cùng bạn cần truy cập vào loại B trong cùng một danh sách đối số. Đó là lý do chính, trong trạng thái hiện tại của Scala, tại sao bạn cần mẫu Aux: hiện tại không thể tham chiếu đến loại last.B trong cùng một danh sách tham số như trong đó last được định nghĩa, cũng không thể có nhiều danh sách tham số ngầm .

def sort[A,B](l: List[A])(implicit last: Last.Aux[A,B], ord: Ordering[B]) = ??? 

Tất nhiên bạn luôn có thể viết Last[A] { type B = B0 } ra đầy đủ, nhưng rõ ràng rằng trở nên rất không thực tế rất nhanh chóng (tưởng tượng thêm một vài thông số ngầm hơn với các loại phụ thuộc, một cái gì đó là rất phổ biến với hình thù); đó là nơi mà bí danh loại Aux có sẵn.

+1

Bạn không kỹ thuật _need_ mẫu' Aux' để tham chiếu đến ' last.B' trong cùng một danh sách tham số; nó chỉ được ưa thích bởi vì nó ít chi tiết hơn so với 'ngầm định cuối cùng: Cuối cùng [A] {loại B = B0}, thứ tự: Đặt hàng [B0]'. – breadmenace

+0

@breadmenace Vâng vâng, về mặt kỹ thuật bạn không bao giờ cần bí danh loại Aux. Tôi giả sử 'mô hình Aux' để tham chiếu đến mô hình rộng hơn, trong đó bí danh loại là cần thiết để có cú pháp chấp nhận được. –

+2

câu hỏi newb - tại sao không phải là loại trả về của defs tiềm ẩn (những người sử dụng Aux) suy ra từ các giá trị tính toán? – mtk

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