Haskell Language
Operatorzy Infix
Szukaj…
Uwagi
Większość funkcji Haskell jest wywoływana z nazwą funkcji, po której następuje argument (notacja przedrostka). W przypadku funkcji, które akceptują dwa argumenty, takie jak (+), czasem uzasadnione jest podanie argumentu przed i po funkcji (infix).
Preludium
Logiczny
&& jest logiczne AND, || jest logiczne LUB.
== oznacza równość, /= brak równości, < / <= mniejsze i > / >= większe operatory.
Operatory arytmetyczne
Operatory numeryczne + , - i / zachowują się w dużej mierze tak, jak można się spodziewać. (Dzielenie działa tylko na liczbach ułamkowych, aby uniknąć problemów z zaokrąglaniem - dzielenie liczb całkowitych musi być wykonywane przy pomocy quot lub div ). Bardziej niezwykłe są trzy operatory potęgowania Haskella:
^przyjmuje podstawę dowolnego typu liczby do nieujemnej, całkowej potęgi. Działa to po prostu przez ( szybkie ) iterowane mnożenie. Na przykład4^5 ≡ (4*4)*(4*4)*4^^robi to samo w przypadku dodatnim, ale działa również w przypadku wykładników ujemnych. Na przykład3^^(-2) ≡ 1 / (2*2)W przeciwieństwie do
^, wymaga to ułamkowego typu podstawowego (tj.4^^5 :: Intnie będzie działać, tylko4^5 :: Intlub4^^5 :: Rational).**implementuje potęgowanie liczb rzeczywistych. Działa to w przypadku bardzo ogólnych argumentów, ale jest bardziej kosztowne pod względem obliczeniowym niż^lub^^i generalnie powoduje małe błędy zmiennoprzecinkowe.2**pi ≡ exp (pi * log 2)
Listy
Istnieją dwa operatory konkatenacji:
:(wyraźne minusy ) wstawia pojedynczy argument przed listą. Ten operator jest w rzeczywistości konstruktorem i dlatego może być również użyty do wzorcowego dopasowania listy („konstrukcja odwrotna”).++łączy całe listy.[1,2] ++ [3,4] ≡ 1 : 2 : [3,4] ≡ 1 : [2,3,4] ≡ [1,2,3,4]
!! jest operatorem indeksującym.
[0, 10, 20, 30, 40] !! 3 ≡ 30
Zauważ, że listy indeksujące są nieefektywne (złożoność O ( n ) zamiast O (1) dla tablic lub O (log n ) dla map ); w Haskell na ogół preferuje się dekonstruowanie list poprzez składanie pasujących wzorców zamiast indeksowania.
Kontrola przepływu
$to operator aplikacji funkcji.f $ x ≡ f x ≡ f(x) -- disapproved styleTen operator służy głównie do unikania nawiasów. Ma również ścisłą wersję
$!, co wymusza ocenę argumentu przed zastosowaniem funkcji..komponuje funkcje.(f . g) x ≡ f (g x) ≡ f $ g x>>sekwencje działań monadycznych. Np.writeFile "foo.txt" "bla" >> putStrLn "Done."najpierw napisze plik, a następnie wydrukuje wiadomość na ekranie.>>=robi to samo, jednocześnie akceptując argument, który zostanie przekazany z pierwszej akcji do następnej.readLn >>= \x -> print (x^2)poczeka, aż użytkownik wprowadzi liczbę, a następnie wyśle kwadrat tej liczby na ekran.
Niestandardowi operatorzy
W Haskell możesz zdefiniować dowolnego operatora infix, który ci się podoba. Na przykład mógłbym zdefiniować operatora obwiedni listy jako
(>+<) :: [a] -> [a] -> [a]
env >+< l = env ++ l ++ env
GHCi> "**">+<"emphasis"
"**emphasis**"
Zawsze powinieneś dać takim operatorom deklarację poprawności , na przykład
infixr 5 >+<
(co oznaczałoby, że >+< wiąże się tak ściśle jak ++ i : do).
Znajdowanie informacji o operatorach infix
Ponieważ poprawki są tak powszechne w Haskell, będziesz musiał regularnie sprawdzać ich podpis itp. Na szczęście jest to tak samo łatwe jak w przypadku każdej innej funkcji:
Wyszukiwarki Haskell Hayoo i Hoogle mogą być używane do operatorów infix , podobnie jak do wszystkiego innego, co jest zdefiniowane w niektórych bibliotekach.
W GHCi lub IHaskell możesz użyć dyrektyw
:ioraz:t( i nfo i t ype), aby poznać podstawowe właściwości operatora. Na przykład,Prelude> :i + class Num a where (+) :: a -> a -> a ... -- Defined in ‘GHC.Num’ infixl 6 + Prelude> :i ^^ (^^) :: (Fractional a, Integral b) => a -> b -> a -- Defined in ‘GHC.Real’ infixr 8 ^^To mówi mi, że
^^wiąże się mocniej niż+, oba przyjmują typy liczbowe jako swoje elementy, ale^^wymaga, aby wykładnik był całkowy, a podstawa ułamkowa.
Mniej szczegółowe:twymaga operatora w nawiasach, na przykładPrelude> :t (==) (==) :: Eq a => a -> a -> Bool