| torsdag 31. desember 2009 18:15 | ||||||||||||||||||||||||||||||||||||||||||||
Haskell i all enkelhet
For denne artikkelen går vi ut ifra at du har installert en fungerende Haskell implementasjon med interaktiv sessions. Hvordan du gjør dette kan du lese om her. Aritmetikk:Ikke uventet kan vi gjøre aritmetiske operasjoner med Haskell. Skriv inn et gyldig aritmetisk uttrykk og trykk enter.
Vi ser i eksempelene over at Haskell Interpreteren gir oss svaret, samt hvilken type den har interferensert svaret til. Mer om typer og inferens senere.
Par, tripletter, tupler:Paranteser brukes for å gruppere verdier av samme type. To verdier er et par, tre er en triplett, og n verdier er en n-tuple.
Vi ser noen tupler og hvordan Haskell Interpreteren interferer typene. Vi kan ha alle gyldige typer i en tupel. Vi har noen innebygde funksjoner som virker på par. fst (first) og snd (second). Merk at verdiene i et par ikke trenger å være av samme type. Dette gjelder alle tupler.
Dersom du prøver disse funksjonene på annet en par vil du få en feilmelding fra Interpreteren.
Oppgave: Skriv en funksjon som returnerer 4 fra tuplet: (('a',4),"string")?
Lister:I motsetning til par, tripletter og tupler kan lister inneholde et ubegrenset antall elementer. Men lister krever derimot at alle elementer i listen er av samme type.
Lister defineres ved hjelp av [ ] (eng:square brackets). Tupler ble definert ved hjelp av ( ) (eng:paranthesis).
Vi konstruerer lister ved hjelp av operatoren con / : (tenk: construct) og den tomme listen.
Noen definerte funksjoner på lister.
Length: Returnerer lengden på listen. D.v.s antall elementer som er i listen. Head: Returnerer første elementet i listen. Tail: Returnerer alt utenom første elementet i listen.
Som nevnt lenger oppe er en streng i Haskell en liste med karakterer.
Vi konkatinerer (setter sammen) lister med ++ operatoren.
Konverter string til numeriske verdier.
Konverter numeriske verdier til string.
Bruk en funksjon på alle elementer v.h.a listefunksjonen map. Map tar inn en funksjon, samt en liste med verdier og anvender den gitte funksjonen på alle elementer i listen. Merk at når vi mapper over en liste vil lengden på innlisten og utlisten være like. Vi endrer kun selve elementene i listen.
Om du bruker en standard WinHugs implementasjon er det mulig du må laste modulen Char for å få tilgang til toUpper / toLower.
Vi kan filtrere ut elementer i en liste ved å bruke listefunksjonen filter.
Vi kan gjøre operasjoner mellom alle elementene i en liste ved å bruke listefunksjonen foldr / foldl. Denne funksjonen tar tre argumenter: en funksjon, en start verdi og en liste.
Merk at vi i (*) eksempelet har satt 1 som start verdi istedenfor 0. Dette fordi 0*(1*2*3) blir 0, og dermed ikke det svaret vi er ute etter. Ved å bruke foldr går vi ut ifra at uttrykket som skal evalueres er høyre assosiativt. Men dette er ikke alltid tilfelle, f.eks ved subtraksjon ( - ).
Vi kan bruke foldl for å assosiere uttrykket mot venstre som vist i eksempelet over. Merk at foldr evaluerer uttrykket forløpende og kan derfor i teorien brukes på uendelige lister, mens foldl evaluerer v.h.a en rekursiv stabel, og en vil derfor kun få resultat på endelige mengder.
Da avslutter vi denne artikkelen her, og gleder oss til neste artikkel kommer. Da skal vi se litt på hvordan vi kan utvide mulighetene våre ved å programmere egne funksjoner, legge de i en ekstern fil som vi laster inn i Interpreteren.
|
||||||||||||||||||||||||||||||||||||||||||||
| Sist oppdatert søndag 18. juli 2010 22:51 |