2013-06-04 29 views
8

Trong C#, không có khái niệm trong xây dựng của tính giao hoán bằng ngôn ngữ. Đó là nếu tôi định nghĩa một lớp đơn giản Vector ví dụ:Tính tương đối trong các toán tử

public struct Vector 
{ 
    private readonly double x, y, z; 
    ... 

    public static Vector operator +(Vector v, double d) {...} 
} 

tôi vẫn sẽ cần phải xác định người điều khiển đối xứng +(double d, Vector v) hoặc bất kỳ biểu hiện của hình thức 2.1 * v sẽ đưa ra một lỗi biên soạn hoặc thất bại khi chạy trong một kịch bản năng động.

Câu hỏi của tôi là hai lần: Thứ nhất, có bất kỳ ngôn ngữ nào ở đó, nơi bạn có thể xác định toán tử giao hoán mà không cần phải xác định cả hai kết hợp toán hạng có thể? Nói cách khác, liệu có bất kỳ ngôn ngữ nào nhận thức được khái niệm về commutativity không? Và thứ hai, nó đã từng được xem xét trong C# và bị loại bỏ vì nó thực sự chỉ là cú pháp cú pháp để tránh một vài thao tác gõ khác mà không thực sự thêm tất cả sự phong phú cho ngôn ngữ (và có lẽ sẽ cần thêm một từ dành riêng)?

+1

Xác định tính tương giao bằng một dòng: 'toán tử tĩnh Vector công khai + (double d, Vector v) {return v + d;}' –

+0

Tôi tin rằng Haskell hỗ trợ điều này ngay lập tức. Điều đó và Prolog. Đã gần 8 năm mặc dù tôi có thể sai. – Haney

+0

Kiểm tra câu hỏi này (và câu trả lời) http://stackoverflow.com/questions/7385937/why-must-i-define-a-commutative-operator-twice –

Trả lời

7

Có bất kỳ ngôn ngữ nào ở đó, nơi bạn có thể xác định toán tử giao hoán mà không cần phải xác định cả hai kết hợp toán hạng có thể?

Tôi không biết bất kỳ điều gì, nhưng điều đó không có nghĩa là chúng không tồn tại.

Đã từng được xem xét trong C# và bị loại bỏ vì nó thực sự chỉ là cú pháp để tránh thêm một số thao tác bàn phím không thực sự bổ sung thêm nhiều ngôn ngữ.)?

Kiến thức của tôi chưa bao giờ được xem xét. Nó chắc chắn không bao giờ nằm ​​trong danh sách các cải tiến ngôn ngữ có thể có, và tôi không nhớ đã nhìn thấy nó trong kho lưu trữ ghi chú thiết kế.

Bạn đưa ra một đối số đầy đủ chống lại đối tượng địa lý trong câu hỏi của bạn. Tôi đã được yêu cầu cung cấp một phê bình bổ sung về tính năng được đề xuất, tôi sẽ chỉ ra rằng nhiều toán tử quá tải không giao hoán ngay cả khi đối tác toán học của chúng là giao hoán. Chuỗi "bổ sung", ví dụ, rõ ràng là không giao hoán mặc dù cả hai toán hạng là chuỗi. Và cũng vậy với đại biểu "bổ sung". Và có rất nhiều thuộc tính khác của các toán tử sẽ có giá trị bằng nhau hoặc hữu ích hơn mà tôi muốn đưa vào trước tính năng tự động giao hoán.

+1

Cảm ơn bạn đã đăng bài này. Tôi đã mong ước tính năng này trong một thời gian dài trong 'C#'. Có thể thông qua một thuộc tính hoặc từ khóa (như ngầm định được sử dụng cho các toán tử chuyển đổi). – ja72

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