Metody realizacji języków programowania/MRJP Wykład 12: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
Linia 25: | Linia 25: | ||
Funkcja map bierze jako argumenty funkcję typu (a->b) i listę elementów typu a, dając w wyniku listę elementów typu b. Zauważmy jednak, że typ funkcji map można odczytać inaczej: argumentem jest funkcja typu (a->b), zaś wynikiem...funkcja typu [a]->[b] | Funkcja map bierze jako argumenty funkcję typu (a->b) i listę elementów typu a, dając w wyniku listę elementów typu b. Zauważmy jednak, że typ funkcji map można odczytać inaczej: argumentem jest funkcja typu (a->b), zaś wynikiem...funkcja typu [a]->[b]. | ||
Funkcja increaseAll korzysta z tego drugiego odczytania, stosując funkcję map z jednym tylko argumentem, którym jest stworzona ad hoc, anonimowa funkcja dodająca jeden do swego argumentu. |
Wersja z 10:42, 21 sie 2006
Implementacja języków funkcyjnych
Specyficzne cechy języków funkcyjnych
Języki funkcyjne posiadają pewne specyficzne cechy, które sprawiają, że metody ich implementacji różnią się znacząco od języków imperatywnych.
Funkcje są pełnoprawnymi obywatelami (ang. first-class citizens):
1. Mogą być argumentami funkcji
2. Mogą być wynikami funkcji
3. Mogą być częściowo aplikowane
4. Mogą być tworzone anonimowo
Spójrzmy na prosty przykład ilustrujący te cechy:
map :: (a->b) -> [a] -> [b] map f [] = [] map f (x:xs) = (f x):(map f xs) increaseAll :: [Int] -> [Int] increaseAll = map (\x->x+1)
Funkcja map bierze jako argumenty funkcję typu (a->b) i listę elementów typu a, dając w wyniku listę elementów typu b. Zauważmy jednak, że typ funkcji map można odczytać inaczej: argumentem jest funkcja typu (a->b), zaś wynikiem...funkcja typu [a]->[b].
Funkcja increaseAll korzysta z tego drugiego odczytania, stosując funkcję map z jednym tylko argumentem, którym jest stworzona ad hoc, anonimowa funkcja dodająca jeden do swego argumentu.