2013-04-24 11 views
6

Podczas pracy z kątami w stopniach chcę zdefiniować symbol stopnia (°), który będzie używany jako operator przyrostkowy. Obecnie używam tej linii (w GHCi):Jak zdefiniować operator postfiksu w Haskell?

let o = pi/180 

i używać go tak:

tan(11*o) 

ale chcę tylko przejść:

tan 11° 

które jest znacznie jaśniejsze. Operator stopnia powinien mieć wyższy priorytet niż "tan" i inne funkcje.

Najbliżej mam to:

let (°) x _ = x*pi/180 

używane tak:

tan(11°0) 

ale domyślne pierwszeństwo oznaczają nawiasy są nadal potrzebne, wraz z podaniem numeru manekina, to alternatywą jest gorsze niż to, z czego obecnie korzystam.

+8

"Operator stopnia powinien mieć wyższy priorytet niż" tan "i inne funkcje." <- To się nie uda, aplikacja funkcyjna ma najwyższy priorytet według specyfikacji językowej. –

+0

Dlaczego po prostu nie zdefiniujesz nowego typu liczbowego (zawijanie Double lub cokolwiek innego) z nowym typem reprezentującym stopnie? Oczywiście będziesz musiał zwrócić uwagę na "modułową" naturę stopni, jeśli chcesz zdefiniować równość, itd. –

+0

Haskell nie jest językiem, w którym można zrobić wszystko, co kompiluje się w sposób, w jaki przyzwyczaiłeś się do pisania to. W przeciwieństwie do Perla czy nawet Pythona, składnia inflinów Haskella jest w rzeczywistości bardzo uproszczona i prosta, tak po prostu jest tak dobrze zaprojektowana, że ​​nawet ta prosta podstawa pozwala na zadziwiającą ilość bardzo wydajnych skrótów, pomijając wiele paren i ogólnie aby było całkiem czytelne. Ale druga kwestia jest po części dlatego, że istnieją raczej sztywne reguły analizy. – leftaroundabout

Odpowiedz

3

Zapoznaj się z fixity declarations, które pozwalają zmienić priorytet operatorów infiksów. Uważaj, aby nie ustawić zbyt wysokiego priorytetu lub inni operatorzy nie będą zachowywać się zgodnie z oczekiwaniami.

Na przykład:

infixl 7 ° 
(°) x _ = x*pi/180 

Edit: ah, prawo @Daniel Fischera - to nie będzie działać dla swoich bieżących potrzeb, ponieważ aplikacja funkcja ma najwyższy priorytet

11

Nie możesz, przynajmniej w Haskell, zgodnie z definicją w Raporcie. Istnieje jednak a GHC extension that allows postfix operators.

Niestety to nie daje wszystkiego, co chcesz; w szczególności wciąż wymaga nawiasów, jak często robi to operator negacji jednoznacznej.