Funksjoner
Da Haskell er er funksjonellt språk ligger det litt i kortene at vi må lære å bruke funksjoner. Det eneste Haskell gjør er å evaluere de funksjonene vi gir til den.
square :: Int -> Int square x = x * x |
increment :: Int -> Int increment x = x + 1 |
twice :: (a -> a) -> a -> a twice f a = f (f a) |
signum :: Int -> Int signum x = if x < 0 then -1 else if x > 0 then 1 else 0 |
Oppgaver: Hva blir resultatet av følgende spørringer?
- square 2
- inrecement 10
- twice increment 10
- signum 10
Løsninger:
Load> square 2 4 :: Integer |
Load> increment 10 11 :: Int |
Load> signum 10 1 :: Integer |
Load> twice increment 10 12 :: Int |
De to første regner jeg med de fleste fikk til uten å kjøre koden i interpreteren. Dette er helt standard funksjonsmapping og er selvforklarende.
Funksjon nummer tre er litt mer spennende og kanskje ikke helt bent frem å forstå. Men det vi har gjort der er at vi tar en funksjon og kaller denne funksjonen med seg selv som argument. Dette er et eksempel på en høyeregradsfunksjon, det vil si en funksjon som tar en annen funksjon som argument. Vi kommer mer tilbake til høyeregradsfunksjoner ved en senere anledning.
Funksjon nummer fire er det første eksempelet vi har på en kontrollstruktur. Vi ser at if/else er veldig lik det vi er vant til fra andre programmeringspråk. Men vi må huske og ha med både en 'then' og en 'else' klausul.
PS! Dersom vi har mange valg vi ønsker å teste mot vil det være enklere å mer oversiktlig og bruke en 'case' kontrollstruktur.
f :: Int -> Int f x = case x of 0 -> 1 1 -> 5 2 -> 2 _ -> -1
|
Load> f 0 1 :: Int Load> f 1 5 :: Int Load> f 2 2 :: Int Load> f 3 -1 :: Int
|
Et eksempel på en 'case' struktur i Haskell. Funksjonen f returnerer forskjellig resultat avhengig av verdien som blir gitt til den.
Legg merke til siste verdien / mønteret vi definerer i funksjonen f, nemlig understrek '_'. Understrek vil matche alle verdier som ikke allerede er matchet. Så for alle andre verdier en 0, 1 og 2 vil funksjonen f matche understrek og dermed returnere verdien -1. Vi kan tenke på understrek som en vilkårlig verdi (eng: wildcard). Vi vil se mye av '_' i senere artikler om Haskell.
...Fortsettes.