Jest to nieco subiektywne, ale mam nadzieję, że lepiej zrozumiem, jakie czynniki sprawiają, że operator jest łatwy w użyciu w porównaniu z tępym i trudnym. Ostatnio zastanawiam się nad projektami językowymi, a jednym z problemów, nad którymi zawsze się zastanawiam, jest to, kiedy wykonać kluczową operację w języku jako operator, a kiedy użyć słowa kluczowego lub funkcji.
Haskell jest z tego powodu znany, ponieważ niestandardowe operatory są łatwe do utworzenia, a często nowy typ danych jest dostarczany z kilkoma operatorami do użytku na nim. Na przykład biblioteka Parsec zawiera mnóstwo operatorów do łączenia parserów, z podobnymi klejnotami >.
i .>
nawet nie pamiętam, co mają na myśli, ale pamiętam, że bardzo łatwo z nimi pracowałem, kiedy już zapamiętałem, z czym mają na myśli. Czy takie wywołanie funkcji leftCompose(parser1, parser2)
byłoby lepsze? Z pewnością bardziej gadatliwy, ale pod pewnymi względami jaśniejszy.
Przeciążenie operatorów w językach podobnych do C jest podobnym problemem, ale jest połączone z dodatkowym problemem przeciążenia znaczenia znanych operatorów, takich jak +
nowe niezwykłe znaczenia.
W każdym nowym języku wydaje się to dość trudnym problemem. Na przykład w F #, casting używa matematycznie wyprowadzonego operatora rzutowania, zamiast składni rzutowania w stylu C # lub pełnego stylu VB. C #: (int32) x
VB: CType(x, int32)
F #:x :> int32
Teoretycznie nowy język może mieć operatory dla większości wbudowanych funkcji. Zamiast def
lub dec
lub var
do deklaracji zmiennej, dlaczego nie ! name
lub @ name
czy coś podobnego. Z pewnością skraca deklarację, po której następuje wiązanie: @x := 5
zamiast declare x = 5
lub let x = 5
większość kodu będzie wymagała wielu definicji zmiennych, więc dlaczego nie?
Kiedy operator jest przejrzysty i użyteczny, a kiedy zasłania?
+
Do konkatenacji łańcuchów lub <<
do strumieni). Z Haskell, z drugiej strony, operator jest albo po prostu funkcja o nazwie użytkownika (czyli nie przeciążony) lub częścią klasy typu co oznacza, że podczas, gdy jest polimorficzny, to robi to samo logiczną rzeczą dla każdego typu i ma nawet ten sam typ podpisu. Tak >>
jest w >>
przypadku każdego typu i nigdy nie będzie trochę przesunięcia.