Wiki2
CodeWorld (changes)

Showing changes from revision #3 to #4: Added | Removed | Changed

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 matar skickar+ ut ett nytt resultat värde8

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

  • Hela tal 1, 2, -1 …
  • Negativa tal -12, -1 …
  • Jämna tal 2, 4, 6, 102
  • Decimal Decimala tal 3.14, 2.4, -12.4

Hur många värden kan funktioner hantera?

Vi såg att + tar två varden 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 som ( räknar hur många värden man matar in.length) som räknar hur många värden man matar in.

 1, 4, 5, 3   "antal "length" värden"   4  99, 3.14, 1003 11.23   "length"   "antal värden"   2

Funktioner kan även ge tillbaka flera värden. Exempelvis en funktion som byter plats pa två värden

Hur många värden kan funktioner hantera?

4, 76    "byt plats"    76, 4

434, 33  "byt plats"    33, 434

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?

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

 3 + 5 = 8 3 * 5 = 15

Man kan också ge en funktion ett namn och kan man skriva funktionen först med värdena inom efter paranteser funktionen

 addera(3, add 5) 3 = 5 8 (+) dividera(16, 3 2) 5 = divide 8 16 2 (/) 16 2

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

 addera(a, add b) a b divide c d

Detta betyder att funktionen addera 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

 addera(a, add b) a b = 8 om a = 3 och b = 5 addera(a, add b) 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, sidan s, såhärs såhär:

 kubens_volym(s) cube s = s*s*s  kubens_volym(1) cube 1 = 1*1*1 = 1 kubens_volym(3) cube 3 = 3*3*3 = 27

I funktionen kubens_volym återanvänder vi funktionen * (multiplikation) för att räkna ut volymen. 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

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

Funktioner kan ocksa jobba med bokstäver

Exempelvis en funktion som ( gör om text till stora bokstaver (versaler)reverse) som ger tillbaka texten baklänges

versaler(“Hej hopp!”) = “HEJ HOPP!”

reverse "Hej hopp!"

Man kan se former som värden. värden

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

 circle(r) circle r = IMAGE Picture

Typer av värden

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

  • Heltal är en typ
  • Decimaltal är en typ
  • Farger är en annan typ
  • Bilder är en annan typ

Några exempel på typer är

  • Heltal
  • Decimaltal
  • Färger
  • Bilder

Vissa värden ingår i flera typer

Exempelvis heltal finns ocksa också bland decimaltal

13 ar samma tal som 13.0000

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

Exempelvis funktionen avrunda(x) round x tar ett decimaltal och ger tillbaka ett heltal

 avrunda(3.14159) round pi = 3

Kan Testa man olika programmera typer med funktioner?

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

Vi kan testa programmering webben på:

round pi
pi - round pi
length "Hej"

Vad händer om du skickar in fel typ?

Du kan testa programmering genom att skriva in funktioner direkt i browsern.

3 - "hej"
3 - length "hej"

pi - (round pi)
pi - fromIntegral (round pi)
λ 3+8 [Enter]
11

λ 3*8 [Enter]
24

λ floor(3.14159) [Enter]
3

λ sort("peter") [Enter]
"eeprt"

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)

sol är en funktion som ger tillbaka en bild av en cirkel med radien 1

  • circle är en funktion som tar ett tal och ger tillbaka en bild av en cirkel
  • sol är en (konstant) funktion som ger tillbaka en bild av en cirkel med radien 1
  • drawingOf är en funktion som tar en bild och ger tillbaka ett program
  • main är en speciell (huvud) funktion som alltid måste finnas och ge tillbaka ett program

mainEn annan skillnad från tidigare är att man skriver värden till funktionen inom paranteser med comma ( är en speciell (huvud) funktion som alltid måste finnas i ett program.,) 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. FunktionensolidCircle (fylld cirkel) gör det.

sol = solidCircle(1)

Man Det kan finns skapa en färgad cirkel genom att skicka cirkeln genom en ny funktion som färgar cirkeln.colored som tar en bild och en färg och skickar ut bilden med en ny färg.

sol = colored(solidCircle(1), yellow)

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å parametrar: 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 parameter värdeyellow inte passar (match) med den förväntade typen, Picture . Det samma gällar andra parametern värdet som inte matchar typenColor.

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 parameter, värde (parameter), sedan ett tal (Number ), sedan ytterligare ett tal tal. till Resultatet och resultatet är en ny bild där bilden är flyttat 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 planeterna planeternas storlek anges om andel av jorden storlek.

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

au = 0.2

Sedan skapar vi planeter. 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 summar summan av (båda) dessa bilder i som retur. en ny bild som resultat.

& :: Picture -> Picture -> Picture

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

 main = drawingOf(sol&jorden) drawingOf( sol & jorden )

Vad hände? Jorden syns inte.

Fixa det genom att flytta jorden ut 4 steg (solradier) i x-led från solen. 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