Wiki2
CodeWorld

Programmering med funktioner

Vad är en funktion?

Inom matematiken används funktioner hela tiden …

Exempelvis + (addition) är en funktion

Skickar man in två värden 3 och 5 så skickar + ut ett resultat 8

3
   [ + ]  8 
5

Andra vanliga funktioner inom matematiken är - (subtraktion), * multiplikation och / (division)

3
   [ - ]  -2 
5

9
   [ / ]  3 
3

Vad är värden?

Värden är de “saker” eller “objekt” som går in och ut från funktioner

Exempel på värden är

Hur många värden kan funktioner hantera?

Vi såg att + tar två värden och ger tillbaka ett värde

Men det finns funktioner som tar och ger tillbaka fler eller färre värden

Vissa funktioner tar bara ett värde. Exempelvis +1 som lägger till 1 till in värdet.

5   [ +1 ]   6

Andra tar hur många värden man vill. Exempelvis en funktion (length) som räknar hur många värden man matar in.

1, 4, 5, 3   "length"   4

3.14, 11.23  "length"   2

Hur många värden kan funktioner hantera?

Funktioner kan även ge tillbaka flera värden. Exempelvis en funktion (reverse) ordnar värdena i omvänd ordning

4, 76    "reverse"    76, 4

434, 33  "reverse"    33, 434

Namngivna värden (konstanter) kan man också se som funktioner som alltid ger samma värde utan in värde

pi = 3.14159 ...

-        "pi"    3.14159 ...

Hur skriver man funktioner?

Vanliga matematiska funktioner skriver man normalt med in värdena på var sida om funktionen

3 + 5 = 8
3 * 5 = 15

Man kan också skriva funktionen först med värdena efter funktionen

add 3 5
(+) 3 5
divide 16 2
(/) 16 2

Ofta skriver man en funktion med värden som okända variabler (värden som man inte bestämt storlek på än)

add a b
divide c d

Detta betyder att funktionen add tar två okända värden (variabler) a och b

Funktioner i programmering

Det visar sig att funktioner är mycket vanliga även inom programmering

Det som kan skilja sig är exakt hur man skriver funktioner i olika programmeringsspråk

Testa att öppna följade sida i en browser.

haskell repl

Här kan man testa att skriva funktioner i programmeringspråket, Haskell

Funktioner i Haskell

Testa exempelvis dessa kommandon

3 + 5
3 - 5
9 / 3
pi / 2
(+1) 1
let add = (+)
(+) 3 5
add 3 5
length [1,4,5,3]
reverse [1,4,5,3]

Det är inte stor skillnad mellan hur man skriver matematiska funktioner och hur man skriver funktioner i Haskell

Hur skapar man egna funktioner?

Om vi bestämmer värdena på in variablerna så har funktionen ett ut värde

add a b = 8 om a = 3 och b = 5
add a b = 10 om a = 5 och b = 5

Man kan själv skapa funktioner som kan räkna ut mer komplicerade saker

Exempelvis kan vi skriva funktionen for volymen av en kub med sidan s såhär:

cube s = s*s*s

cube 1 = 1*1*1 = 1
cube 3 = 3*3*3 = 27

I funktionen kubens_volym återanvänder vi funktionen * (multiplikation) för att räkna ut volymen

Testa att skapa en funktion

I Haskell kan man skapa en funktion genom att definera den med ordet let

let cube s = s*s*s
cube 3

Man kan skapa hur komplicerade funktioner som helst. Ofta använder en funktion andra funktioner

let sphere_area r = 4*pi*r*r
sphere_area 3

let sphere_vol r = 4*pi*r*r*r / 3
sphere_vol 3

let sphere_diff r = sphere_area r - sphere_vol r

sphere_diff 2.9
sphere_diff 3
sphere_diff 3.1

Andra typer av värden

Funktioner behöver inte bara hantera siffror

Exempelvis när man målar och blandar färg kan man se som en funktion

add ${\color{yellow}gult}$ ${\color{blue}blått}$ = ${\color{green}grönt}$

Funktioner kan ocksa jobba med bokstäver

Exempelvis en funktion (reverse) som ger tillbaka texten baklänges

reverse "Hej hopp!"

Man kan se former som värden

Exempelvis funktionen circle r ge tillbaka en bild (Picture) av en cirkel med radien r

circle r = Picture

Typer av värden

Olika värden kan delas upp i olika typer (eller klasser) av värden

Några exempel på typer är

Vissa värden ingår i flera typer

Exempelvis heltal finns också bland decimaltal

13 ar samma tal som 13.0000

Funktioner kan ta och ge tillbaka olika typer av värden

Exempelvis funktionen round x tar ett decimaltal och ger tillbaka ett heltal

round pi = 3

Testa olika typer

Testa några funktioner som tar olika typer in in och ut värde. Vilka typer är det?

round pi
pi - round pi
length "Hej"

Vad händer om du skickar in fel typ?

3 - "hej"
3 - length "hej"

pi - (round pi)
pi - fromIntegral (round pi)

Programmera bilder!

Man kan även skapa bilder direkt genom programmering

Vi ska göra detta på en annan hemsida som heter http://code.world

Ett mycket enkelt program ser ut så här:

main = drawingOf(sol)

sol = circle(1)

En annan skillnad från tidigare är att man skriver värden till funktionen inom paranteser med comma (,) emellan

Värdet som kommer ut från main är resultatet när man kör programmet.

  1. Testa att skiva in programmet
  2. Testa att köra programmet genom att trycka på Run (kör)
  3. Vad är resutatet från programmet när du kör det?

Mer avancerade program - Solsystemet!

Nu är vi redo för mer avancerade program.

Vi ska skriva ett program som simulerar solsystemet!

Till vår hjälp har vi lite dokumentation.

Färger

Först ska vi byta ut cirkeln mot en fylld cirkel. Funktionen solidCircle (fylld cirkel) gör det.

sol = solidCircle(1)

Det finns en funktion colored som tar en bild och en färg och skickar ut bilden med en ny färg.

Skicka cirkeln och färgen yellow (gul) så får vi en färgad cirkel.

sol = colored( solidCircle(1) , yellow)

Testa detta!

Olika typer

Vad är händer egentligen när man anropar funktionen colored()?

colored() tar två värden (parametrar):

  1. En bild (Picture) som i det här fallet är solidCircle(1)
  2. En färg (Color) som i det här fallet är yellow

Det värde som kommer ut från funktionen är en ny bild (Picture) dvs. en gul fyllt cirkel.

Det är viktigt att alltid skicka in värden av rätt typ i funktioner annars kommer programmet inte att fungera.

Olika typer

Testa exempelvis att byta plats på typerna bild och färg i funktionen colored() och kör programmet (Run).

Line 3, Column 15: error:
    • Couldn't match expected type Picture with actual type Color
    • In the expression: yellow
      In the parameter(s) of colored, namely
        (yellow, solidCircle (1))
      In the expression: colored (yellow, solidCircle (1))

Line 3, Column 23: error:
    • Couldn't match expected type Color with actual type Picture
    • In the expression: solidCircle (1)
      In the parameter(s) of colored, namely
        (yellow, solidCircle (1))
      In the expression: colored (yellow, solidCircle (1))

Detta är ett felmeddelande som talar om att funktionens första värde yellow inte passar (match) med den förväntade typen, Picture. Det samma gällar andra värdet som inte matchar typen Color.

Det står också på vilken rad felet är.

Fler funktioner och typer

Liksom funktionen colored finns många andra funktioner som förändrar bilden som skickas in.

Funktionen translated tar en bild som första värde (parameter), sedan ett tal (Number), sedan ytterligare ett tal. Resultatet är en ny bild där bilden är flyttad (translated) i x och y led.

Så här skriver man vilka typer som funktionen tar. Sista typen är resultatet.

translated :: Picture -> Number -> Number -> Picture

Man kan få hjälp med vilka typer en funktion tar i code.world.

Tryck tr och sedan Ctrl+Space

Titta också på funktionen colored genom att trycka co och Ctrl+Space

Planeter

Nu är det dags för solen att få sällskap av nya planeter.

Vi skapar fler planeter vid sidan om solen i solsystemet

På wikipedia kan man se att planeternas storlek anges om andel av jorden storlek.

Vi bestämmer att jorden storlek ska vara 20% av solens.

au = 0.2

Sedan skapar vi planeter …

merkurius = solidCircle(au*0.4)
venus = solidCircle(au*0.4)
jorden = solidCircle(au*1)
mars = solidCircle(au*1.5)

Testa att rita ut en av planeterna.

main = drawingOf(venus)

Flera planeter

Hur kan vi rita ut flera planeter samtidigt?

Det finns en funktion & som tar två bilder och skickar ut summan (båda) dessa bilder som en ny bild som resultat.

& :: Picture -> Picture -> Picture

Testa genom att rita ut både solen och jorden.

main = drawingOf( sol & jorden )

Vad hände? Jorden syns inte.

Fixa det genom att flytta jorden ut 4 steg (solradier) i x-led från solens centrum.

jorden = translated(solidCircle(au*1), 4, 0)

Ett solsystem

Så här ser inre delen av solsystemet ut …

main = drawingOf(solsystem)

au = 0.2

sol = colored(solidCircle(1), yellow)

merkurius = translated(solidCircle(au*0.4), 2, 0)
venus = translated(solidCircle(au*0.7), 3, 0)
jorden = translated(solidCircle(au*1), 4, 0)
mars = translated(solidCircle(au*1.5), 5, 0)

solsystem = sol & merkurius & venus & jorden & mars

Planeter som rör på sig

References

LatexTest