Haskell funksjoner, bindinger og rekursjon

Haskell funksjoner, bindinger og rekursjon

Thu 31 December 2009

For denne artikkelen går jeg ut ifra at du har lest

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.