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ład

    4^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ład

    3^^(-2)  ≡  1 / (2*2)
    

    W przeciwieństwie do ^ , wymaga to ułamkowego typu podstawowego (tj. 4^^5 :: Int nie będzie działać, tylko 4^5 :: Int lub 4^^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ład

    Prelude> :t (==)
    (==) :: Eq a => a -> a -> Bool
    


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow