2013-06-04 6 views
8

W języku C# nie ma wbudowanego pojęcia komutatywności w języku. To jest, jeśli mogę zdefiniować prostą Vector klasę na przykład:Komutacja w operatorach

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

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

będę nadal trzeba zdefiniować operator symetryczny +(double d, Vector v) ani żadnej ekspresji postaci 2.1 * v daje błąd kompilacji lub nie w czasie wykonywania w dynamicznej scenariusza.

Moje pytanie jest dwojakie: Po pierwsze, czy są jakieś języki, w których można zdefiniować operatorów przemiennych bez potrzeby definiowania obu możliwych kombinacji operandów? Innymi słowy, czy istnieją języki znające samą koncepcję komutacji? Po drugie, czy kiedykolwiek rozważano to w języku C# i złomowano, ponieważ jest to po prostu syntaktyczny cukier, aby uniknąć kilku dodatkowych naciśnięć klawiszy, które tak naprawdę nie dodają tak dużo bogactwa do języka (i najprawdopodobniej potrzebowaliby dodatkowego zarezerwowanego słowa)?

+1

Definiowanie komutatywności za pomocą jednej linii: 'public static Operator wektorowy + (double d, Vector v) {return v + d;}' –

+0

Wierzę, że Haskell natychmiast to potwierdza. To i Prolog. Minęło już prawie 8 lat, więc mogę się mylić. – Haney

+0

Sprawdź to pytanie (i odpowiedzi) http://stackoverflow.com/questions/7385937/why-must-i-define-a-commative -operator-twice –

Odpowiedz

7

Czy są jakieś języki, w których można zdefiniować operatorów przemiennych bez potrzeby definiowania obu możliwych kombinacji operandów?

Nie znam żadnych, ale to nie znaczy, że nie istnieją.

Czy kiedykolwiek rozpatrywać w C# i złomowany jak to naprawdę jest cukier syntaktyczny tylko w celu uniknięcia kilka dodatkowych klawiszy, które tak naprawdę nie dodają aż tak dużo bogactwo języka (i najprawdopodobniej potrzeba dodatkowego słowa zastrzeżonego)?

Zgodnie z moją wiedzą nigdy nie było to brane pod uwagę. Z pewnością nigdy nie było na liście możliwych ulepszeń językowych i nie przypominam sobie, żeby widziałem to w archiwum notatek projektowych.

Wystawiasz wystarczający argument przeciwko funkcji w pytaniu. Gdybym został poproszony o przedstawienie dodatkowej krytyki proponowanej cechy, chciałbym zwrócić uwagę, że wielu przeciążonych operatorów nie jest przemiennych, nawet jeśli ich matematyczne odpowiedniki są przemienne. Na przykład ciąg "add" nie jest przemienny, mimo że oba operandy są ciągami. To samo dotyczy delegata "dodatku". I jest wiele innych właściwości operatorów, które byłyby równie użyteczne, lub bardziej użyteczne, jakie chciałbym wprowadzić przed auto-commutivity.

+1

Dzięki za umieszczenie tego. Od dawna pragnęłem tej funkcji w 'C# '. Może za pośrednictwem atrybutu lub słowa kluczowego (jak niejawny jest używany dla operatorów konwersji). – ja72