2010-06-18 30 views
17

Scala implicits rất mạnh mẽ. Tôi tò mò nếu họ là một tính năng mới/độc đáo của Scala, hoặc khái niệm đã tồn tại trong các ngôn ngữ lập trình khác.Các ngôn ngữ lập trình khác có hỗ trợ implicits "a la Scala"

Cảm ơn.

EDIT:

Để làm rõ câu hỏi của tôi, vâng, tôi đang nói về thực hiện cụ thể này. Có "những điều ngầm" xung quanh dường như kỳ lạ lúc đầu, nhưng đã sử dụng nó trong một thời gian và nhìn thấy cách người khác sử dụng nó, tôi ấn tượng bởi nó hoạt động tốt như thế nào.

+0

Tôi nghĩ bạn nên phân biệt giữa các phương thức tiềm ẩn và giá trị tiềm ẩn. Tôi đoán nó là khá có thể là một ngôn ngữ chỉ hỗ trợ một trong số họ. Tất nhiên, có cả hai mở ra cánh cửa cho khả năng hơn nữa, giống như đã được đề cập "mô phỏng các loại lớp học" giải pháp, đó là thực tế là một sự kết hợp thông minh của họ. –

+0

Tôi đang sử dụng từ * implicits * để tham chiếu cả chuyển đổi tiềm ẩn và giá trị/thông số tiềm ẩn. Tôi nghĩ đó là cách giải thích "bình thường" trong ngữ cảnh Scala nhưng có lẽ tôi sai. – gerferra

+0

@Daniel Rất cám ơn!Tôi đã chỉnh sửa câu hỏi xóa ghi chú và tin nhắn của bạn. Cảm ơn một lần nữa. – gerferra

Trả lời

14

Hình như là nguồn cảm hứng là các lớp học kiểu Haskell. Ít nhất một bài viết trên blog tuyên bố rằng implicits have their origin in Haskell type classes; bài viết đề cập đến một bài báo năm 2006 của Martin Odersky, Poor Man's Type Classes. Và Daniel Sobral đã viết một bài báo gần đây về cách simulate type classes with implicits.

+0

Thật vậy, một trong những điều gây ấn tượng với tôi nhiều hơn là * loại lớp * điều được sử dụng trong 'Ordering' và' Numeric'. Cảm ơn bạn đã tham khảo! – gerferra

+6

Mặc dù vậy, các giả thuyết là tổng quát hơn nhiều so với các loại lớp. Ví dụ, bạn luôn có thể chọn để truyền một tham số ngầm định một cách rõ ràng, thay vì để trình biên dịch điền vào cho bạn. Trong khi đó, máy in Haskell luôn được thực hiện bởi trình biên dịch. –

1

Nó phụ thuộc vào mức độ bạn muốn kéo dài cụm từ "hỗ trợ implicits". Một trong những lý do thuyết phục cho implicits trong Scala là về cơ bản thêm các phương thức vào một lớp đang tồn tại (mà bạn không có quyền truy cập). Điều này có thể có trong các ngôn ngữ khác thông qua các cấu trúc khác nhau: ví dụ, Smalltalk, Ruby, và Objective-C đều hỗ trợ thêm các phương thức vào các lớp bạn không kiểm soát.

1

Nếu tôi hiểu chính xác các thông tin từ http://patricklogan.blogspot.com/2007/06/scala-implicits.html thì có, có một số ngôn ngữ hỗ trợ nó.

Ví dụ tốt nhất là C# Phương pháp mở rộng. Một ví dụ gần đây nơi tôi đã sử dụng chúng:

Tôi thường phải tính toán khoảng cách giữa hai số Point s. Một Point không có phương pháp để tính toán khoảng cách đến điểm khác vì vậy tôi thêm đoạn mã sau vào dự án của tôi:

class MyPointExtension 
{ 
    public static Double GetDistance(this Point p1, Point p2) 
    { 
    return /* the pythagoras code */ 
    } 
} 

tôi có thể sau đó làm:

Point unitPosition = new Point(x,y); 
Point target = new Point(x2,y2); 
Double distance = unitPosition.GetDistance(target); 
+8

Scala implicits mạnh mẽ hơn phương pháp mở rộng C#. Trong các từ của Odersky * "[trong C#] bạn chỉ có thể thêm các phương thức, không phải các trường hoặc các giao diện vào một lớp" *. Xem tại đây http://www.artima.com/weblogs/viewpost.jsp?thread=179766 – gerferra

+5

Tôi đồng ý với @ german1981, các phương pháp mở rộng là một trong những cách sử dụng cho các vi phạm của Scala, nhưng nó không có cơ chế nào của chính chúng. –

1

Mặc dù không mạnh bằng Scala có nghĩa là C++ đã có các toán tử chuyển đổi và các nhà xây dựng sao chép có thể dẫn đến chuyển đổi loại tiềm ẩn. Kết hợp với khả năng xác định các toán tử nhị phân (một cái gì đó mà Scala không cho phép), điều này mang lại một số sức mạnh của Scala implicits.

5

Có một bài báo thực sự hay ở các Nguyên tắc Lập trình Lanages (POPL) vào năm 2000, giới thiệu implicit parameters. Chúng đã được triển khai trong Haskell. Tôi chắc chắn Martin Odersky, nhà thiết kế của Scala, đã nhận thức được công việc này. (Martin là người tham gia thường xuyên và hoan nghênh và đóng góp cho POPL.)

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