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 :: Int
nie będzie działać, tylko4^5 :: Int
lub4^^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 style
Ten 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
:i
oraz: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:t
wymaga operatora w nawiasach, na przykładPrelude> :t (==) (==) :: Eq a => a -> a -> Bool