2014-07-22 20 views
5

Như đã thấy here, bản đồ được định nghĩaCó hướng dẫn toàn diện nào về cách sử dụng kiểu gõ cấu trúc này không?

theo một cách hơi sôi nổi

Đối với đầy đủ lợi ích, đây là các mã:

implicit def FunctionFunctor[R] = new Functor[({type l[a] = R=>a})#l] { 
    def map[A, B](fa: R => A)(f: A => B) : R => B = (x => f(fa(x))) 
} 

Cụ thể hơn - new Functor[({type l[a] = R=>a})#l]

Tôi nghĩ rằng tôi biết những gì đang xảy ra, nhưng không thể nói một cách trung thực rằng tôi hoàn toàn hiểu t anh ấy khái niệm. Và kể từ khi không có bất kỳ gợi ý, tôi không thể kiện google thuật ngữ (tôi chỉ đơn giản là không biết điều đó để google). Có một số hướng dẫn (hoặc xem xét, hoặc bất cứ điều gì) tồn tại, nơi điều này được giải thích với một mức độ tốt hơn của detalization? Tôi muốn đánh giá cao hơn nữa là ai đó có thể giải thích nó ngay tại đây trong các câu trả lời.

Trả lời

8

Đây là trường hợp đặc biệt về nhập cấu trúc nhưng được gọi là 'kiểu lambda', nếu bạn tìm kiếm type lambda scala google sẽ cung cấp cho bạn một số kết quả.

Tóm lại, nó được sử dụng theo cách tương tự như các hàm được áp dụng một phần.

def x(a:Int, b:Int):Int = a * b 
val x10 = x(10, _:Int) 
x10(2) // 2 

Ví dụ về các loại.

type IntEither[B] = Either[Int, B] 
val y:IntEither[String] // Either[Int, String] 

Trong một số trường hợp các phương pháp hoặc các lớp học hy vọng một kiểu với một tham số duy nhất

class Test[F[_]] 

Bạn không thể cung cấp cho lớp Test một EitherTest hy vọng một loại với 1 tham số và Either có 2. Trong để có thể vượt qua trong một số Either, chúng tôi có thể áp dụng một phần nó

type X[B] = Either[Int, B] 
new Test[X] 

Một cách khác để viết nó là như thế này:

type X = { 
    type T[x] = Either[Int, x] 
} 

new Test[X#T] 

Thay vì tạo ra một loại bí danh, chúng ta cũng có thể xác định loại X nặc danh

new Test[({type T[x] = Either[Int, x]})#T] 

Những tất cả cung cấp cho bạn một thể hiện của loại Test[Either[Int, x]].


Sửa

ví dụ bạn có thể trông như thế này:

type PartiallyTypedFunction[R] = { 
    type T[x] = R => x 
} 

implicit def FunctionFunctor[R] = 
    new Functor[PartiallyTypedFunction[R]#T] { 
    def map[A, B](fa: R => A)(f: A => B): R => B = (x => f(fa(x))) 
    } 
+0

wow, là nó mà đơn giản? : D – tkroman

+0

Thật vậy, có vẻ quá phức tạp. Đó là lý do tại sao tôi thường tạo ra một loại bí danh hoặc thậm chí một đặc điểm hoặc một lớp để ngăn chặn bằng cách sử dụng cú pháp khủng khiếp đó. – EECOLOR

+0

@cdshines Tôi đã thêm một ví dụ về mã bạn đã đăng bằng bí danh loại. – EECOLOR

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