2011-11-15 19 views
23

Niech f x y = x * y. Możemy zastosować tę funkcję na dwa sposoby: f 5 6 lub używając notacji infiksowej, 5 `f` 6. Czy reguły operatora odnoszą się do tego ostatniego wyrażenia? Jakie pierwszeństwo ma ta aplikacja? Czy jest to po prostu kolejna forma aplikacji funkcji, a więc będzie miała również najwyższy priorytet?Wstrzymanie aplikacji trybu nawiaskowego Haskella

Przypuszczam, że kompilator widzi ten specjalny formularz (z powodu `` i/lub nazwa zaczynająca się na literę (?)) I faktycznie traktuje to jako zwykłą aplikację funkcji, zamiast traktować ją jako operatora.

+2

Składnia Haskell 98 pozwala wybrać poziom pierwszeństwa, zobacz szczegóły na stronie http://www.haskell.org/onlinereport/decls.html#fixity. –

+0

Dzięki Atal S-Z do edycji! – demi

Odpowiedz

22

Haskell 98 Report ma przekrój w Operator Applications że czyści go:

operator jest albo symbolem operatora, na przykład + lub $$ lub jest zwykły identyfikator zawarty w grawis (małe cudzysłowy) , takie jak `op`. Na przykład, zamiast pisać przedrostek aplikacji op x y, można napisać aplikację infix x `op`y. Jeśli nie podano deklaracji stałej dla opcji "op", to domyślnie jest ona ustawiona na najwyższy priorytet i pozostawia powiązanie (patrz sekcja 4.4.2).

Jak wskazano przez innych odpowiedzi, raport zawiera także rozdział poświęcony Fixity Declarations który pozwala na zdefiniowanie własnej stałości, na przykład:

infixl 7 `op` 
9

Jeśli nie podano wyraźnej deklaracji stałej, np.

infixl 7 `quot` 

backticked funkcja infiks ma domyślny stałość infixl 9, więc traktowany jak każdy inny podmiot Infix z samym stałości.

+0

Dlaczego domyślnie jest to infixl 9? Czy istnieje jakiś powód tego wyboru, czy jest on arbitralny? – CMCDragonkai

+1

W pewnym sensie jest to oczywiście arbitralne. Ale ponieważ posiadanie 'infix' nie pozwala na łańcuchowanie bez nawiasów, wygodniej jest mieć kierunek asocjacji. Powiązanie prawostronne jest rzadsze, więc 'infixl' jest" najmniej zaskakującym "wyborem. Poziom priorytetu 9 jest najbliższy pierwszeństwu prefiksu, dlatego zmienia się najmniej w stosunku do aplikacji prefiksowej. Nie było mnie tam, kiedy się zdecydowano, ale myślę, że pomysł "infixl 9" został wybrany z oczekiwaniem, że jest najwygodniejszy i najmniej zaskakuje. –

+0

Rozumiem, ale co z takimi rzeczami jak '!!' i '$'. Czy jest jakiś powód, dla którego '!!' ma wyższy priorytet niż '$'? Po prostu staramy się zrozumieć rozumowanie wszystkich pozycji operatorów w tabeli: https://www.haskell.org/onlinereport/decls.html#fixity – CMCDragonkai