Kap9. Operatorn.. Hudak 9.4 sid 11. Fermats förmodan, eller Fermats stora sats säger att. xm + ym == zm har heltalslösningar om och endast om m == 2.

Relevanta dokument
Del : Paradigmer allmänt.

Tentamensdag 2002-aug-20 Tentamen i Funktionell Programmering Skrivtid 5 h

Kungliga Tekniska Högskolan Ämneskod 2D1370 Tentamensdag 2001-maj-31 Tentamen i Funktionell Programmering Skrivtid 4 h

Föreläsning 4 (och 5?) i programmeringsparadigm.

Föreläsning 8. Hudak kapitel 13. 2D1370 Funktionell programmering v15 torsdag

Men först: Några funktioner ur preluden. Introduktion till programmering. Uppgiften. Variationer av uppgiften. Föreläsning 4

I kapitel 15 gör Hudak för reaktiva animeringar detsamma som han i kapitel 13 gör för animeringar. Resultatet är en module Fal.

Föreläsning 4 i programmeringsparadigm.

Nada, KTH Tentamensdag maj -24 Tentamen i Funktionell Programmering Skrivtid 5 h

Föreläsning 6 i programmeringsparadigm. Tips kring programmering i Haskell och kring labbarna.

Föreläsning 5 i programmeringsparadigm. Tips kring programmering i Haskell och kring labbarna.

Föreläsning 5 i programmeringsparadigm.

Introduktion till programmering. Standardfunktioner. Vad används datorer till? Standardfunktioner. Föreläsning 2. Prelude. $ ghci...

Föreläsning 8. Paradigmöversikt, paradigmhistoria, paradigmgeografi. Se även föreläsning 1.

Del : Funktionell programmering. I alla deluppgifterna, använd Haskell och skriv typen för de identifierare du definierar.

Föreläsning 4 (och 5?) i programmeringsparadigm.

Funktionell programmering DD1361

Del : Paradigmer allmänt.

Välkomna till DIT012 IPGO. Tyvärr en bug i Google Docs: Sidnummer stämmer inte alltid. Alla anteckningar börjar på sidan 1.

Nada KTH 2004 jan 12 Tentamen Programmeringsparadigm 2D1350 Skrivtid 5 h 8-13

Enjoy Vattenfallsmodellen i funktionella språk

Föreläsning 7 i programmeringsparadigm. Ytterligare Högre ordningens funktioner: filter, foldr foldl. Hutton 7.2, 7.3 och 7.4.

kl Tentaupplägg

DD1361 Programmeringsparadigm. Carina Edlund

Enjoy Vattenfallsmodellen i funktionella språk

Introduktion till Haskell

Del : Funktionell programmering. I alla deluppgifterna, använd Haskell och skriv typen för de identifierare du definierar.

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Tentamen Grundläggande programmering

n Detta för att kunna koncentrera oss på n Tal: number? n Symboler: symbol? n Strängar: string? n Tecken: char? n Boolskt: boolean?

Funktionell programmering. Haskell. Ge#ng started...

Tentamen i Grundläggande Programvaruutveckling, TDA548

Föreläsning 8 i programmeringsparadigm. Kommentarer kring schacklabben.

F6: Högre ordningens funktioner. Mönster för rekursion (1) Mönster för rekursion (1b) Mönster för rekursion (2) Högre Ordningens Funktioner

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2010/11 moment 9 Sida 1 Uppdaterad

Nada Tentamensdag 2004 okt 18 Tentamen Programmeringsparadigm Skrivtid 5 h

TDDC74 Programmering: Abstraktion och modellering Dugga 2, kl 8 10, 5 mars 2015

Programmering II (ID1019) :00-17:00

Föreläsning 10 i programmeringsparadigm. Boxmodellen för append.

Senast. Idag. Icke-strikt evaluering. Strikt evaluering. Testa latheten! Lat evaluering. Plus och minus med lat evaluering. Testa latheten!

Nada KTH 2003 okt 23 Tentamen Programmeringsparadigm 2D1350 Skrivtid 5 h 8-13

Tenta (TEN3) i kursen 729G04 Programmering och diskret matematik 5 feb 2016, kl 14:00-18:00

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

kl Tentaupplägg

Korsordlösare Sara Hedbrandh Strömberg Programkonstruktion VT 10 Inlämninsguppgift

kl Tentaupplägg

Objektorienterad Programmering (TDDC77)

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2011/12 moment 9 Sida 1 Uppdaterad

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

HI1024 Programmering, grundkurs TEN

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Föreläsning 8. newtype Chess = Chess [(Square, Chessman)] -- data ist f newtype OK -- data istället för newtype krävs om >1 konstruerare.

Objektorienterad Programmering (TDDC77)

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Outline. For. I istället för att följa det normala ordningen, man ändra den. I i Java får man inte göra hopp hur som helst

TDDC74 Programmering: Abstraktion och modellering Tenta, kl 14 18, 11 juni 2014

Agenda (obs! halvdag)

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 17-19

Tentamen. 2D4135 vt 2004 Objektorienterad programmering, design och analys med Java Torsdagen den 3 juni 2004 kl

Schemaunderlag för Programmering, grundkurs (TDDB18)

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson 2

Dagens föreläsning Programmering i Lisp Fö 5

Omtentamen (del 1, 6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

LÖSNINGSFÖRSLAG TENTAMEN PROGRAMMERING I ETT FUNKTIONELLT SPRÅK ML, 5P

Övning2. Variabler. Data typer

Börja med att kopiera källkoden till din scheme-katalog (som du skapade i Laboration 1).

Laboration: Whitebox- och blackboxtesting

kl Tentaupplägg

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 14-16

Övning 1 - Abstrakta datatyper

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

DUGGA Tentaupplägg

tentaplugg.nu av studenter för studenter

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

kl Examination - Ada

729G04 Programmering och diskret matematik. Python 2: Villkorssatser, sanningsvärden och logiska operatorer

Föreläsning 9 i programmeringsparadigm. Paradigmöversikt, paradigmhistoria, paradigmgeografi. Se även föreläsning 1.

Tentamen Programmering fortsättningskurs DIT950

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Föreläsning [ ] i programmeringsparadigm. Om multiparadigm-språket OZ och en tjock bok.

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 9 Om högre ordningens funktioner. PK1&PM1 HT-06 moment 9 Sida 1 Uppdaterad

DD1314 Programmeringsteknik

Introduktion till programmering. Undervisning. Litteratur och examination. Lärare. Föreläsning 1

Tentamen i Grundläggande Programvaruutveckling, TDA548

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

kl Tentaupplägg

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Kursanalys för Programmeringsparadigm 2D1361, läsperiod 1 och 2 läsåret 2005/2006

TDDC74 Programmering, abstraktion och modellering. Tentamen

Tentaupplägg. Betygsgränser: 1 uppg 19:00 Betyg 3 2 uppg 18:00 Betyg 4 2 uppg 16:30 Betyg 5 3 uppg 18:00 Betyg 5

Övning 6. Ali Tofigh 24 Oktober, 2006

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

Övning från förra gången: readword

TENTAMEN OOP

HI1024 Programmering, grundkurs TEN

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Datalogi, grundkurs 1

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Transkript:

Föreläsning 6. Hudak kapitel 8, 9, 10, 11, 23, Appendix B. Grafik med klickning. 2D1370 Funktionell programmering v14 torsdag Kap 8. Ett exempel på användning av listomfattningar. Fermats förmodan, eller Fermats stora sats säger att xm + ym == zm har heltalslösningar om och endast om m == 2. Om vi kan finna ett enda motexempel har vi motbevisat denna förmodan. Fermats fömodan framfördes på 1600-talet och förblev obevisad i över 300 år. Här är några funktioner som skulle kunna finna eventuella motexempel: triples :: Integer -> [(Integer, Integer, Integer)] -- generated triples triples n = [(x, y, z) x <- [1..n], y <- [x..n], z <- [y..n] ] {- Main> triples 3 [(1,1,1),(1,1,2),(1,1,3),(1,2,2),(1,2,3),(1,3,3),(2,2,2),(2,2,3),(2,3,3),(3,3,3)] -} pyt :: Integer -> (Integer, Integer, Integer) -> Bool -- testtriple pyt m (x, y, z) = x^m + y^m == z^m fermattriples :: Integer -> Integer ->[(Integer, Integer, Integer)] fermattriples n m = [trip trip <- triples n, pyt m trip] {- Main> fermattriples 15 2 -- list of tested triples n <= 15, m == 2 [(3,4,5),(5,12,13),(6,8,10),(9,12,15)] -} firsttriple :: Integer -> (Integer, Integer, Integer) firsttriple m = head ([ list n <- [1..], list <- fermattriples n m ]) {- Main> firsttriple 2 -- first tested triples m == 2 (3,4,5) Main> firsttriple 3 -- first tested triples m == 3 {Interrupted!} -- No answer after a wile Styr-c, "Controll -c" -} fermatsprop :: IO() -- nice output fermatsprop = putstr ( concat [ "\n m == " ++ show m ++ " " ++ show (firsttriple m) m <- [2..] ]) {- Main> fermatsprop {- m == 2 (3,4,5) m == 3 {Interrupted!} Ett klyftigare program skulle söka på ett bättre sätt. Detta program försöker ju i all evighet söka ett motexempel för m == 3. Kap9. Operatorn.. Hudak 9.4 sid 11.

Kap 23. PreludeList. Olika sätt att programmera words. Hudak kap 23 innehåller en genomgång av olika funktioner i PreludeList, som är en del av Prelude och vars definitioner således alltid finns tillgängliga när man kör Hugs. Många funktioner har definitioner som är enkla att förstå och genom att läsa definitionerna förstår man funktionernas syfte. Bl a definieras span och break för att bryta isär listor i två dellistor, brytpunkten definieras som första elementet i listan som uppfyller ett predikat (dvs en funktion elementtypen -> Bool) span :: (a -> Bool) -> [a] -> ([a],[a]) -- OBS fel i Hudak sid 235 span p [] = ([],[]) span p xs@(x:xs ) -- namn på helheten xs och delarna (x:xs ) p x = (x:ys, zs) otherwise = ([],xs) where (ys,zs) = span p xs break :: (a -> Bool) -> [a] -> ([a],[a]) break = span (not.p) -- span (\x -> not (p x)) break används av funktionen words (Hudak sid 238) som delar upp en sträng i ord: Main> words "Haskell is a functional programming language" ["Haskell","is","a","functional","programming","language"] words :: String -> [String] -- split? verb? substantiv? words s = case dropwhile isspace s of "" -> [] s -> w : words s where (w,s ) = break isspace s --(1740 reductions, 2616 cells) Här används case, som man inte använder så ofta. case gör att man kan göra mönsterpassning (pattern match) på resultatet av ett uttryck. Oftast använder vi ju mönsterpassning när vi gör en funktionsapplikation. Man kan (förstås, allting går att göra med funktioner, det är det som är funktionell programmering) använda en hjälpfunktion istället för case : words2 :: String -> [String] words2 s = wf (dropwhile isspace s) where wf "" = [] wf s = let (w,s ) = break isspace s in w : words2 s --(1740 reductions, 2616 cells) Hudak skriver en del om case på sidan 351 i Appendix B, som handlar om reglerna för mönsterpassning. Man kan skriva word direkt utan att gå via break, men det är inte helt lätt. Låt oss studera några olika sätt (utförligare på föreläsninjgen, om du tycker det är svårt att förstå detta : gör små reduktioner så ser du hur det fungerar): Om vi tänker som vanligt, dvs studerar definitionsmämngden, dvs att en lista är tom eller består av minst ett element och en svans (som kan vara tomma listan) får vi som vanligt två ekvationer. Emellertid avgränsas ju orden av mellanslag, så med mönsterpassning kan vi genast dela på fallet "ett element och en svans" till två ekvationer. Det är sedan inte så lätt att inse att man vid fallet mellanslag skall börja med en ny tom sträng "". Vi behöver också en hjälpfunktion addon som fungerar så här: addon o ("d":"dag":[]) blir "od":"dag":[].

Dessutom behöver vi en ekvation för att behandla (fler)dubbla mellanslag som ett mellanslag: words3 :: String -> [String] --"god dag" => ["god", "dag"] words3 [] = [] -- med hjälpfunktion words3 ( : :cs) = words3 ( :cs) words3 ( :cs) = "":words3 cs -- words3 (c:cs) = addon c (words3 cs) where addon :: Char -> [String] -> [String] addon c (w:ws) = (c:w):ws addon c [] = [c:[]] -- (861 reductions, 1278 cells) Bäst! En alternativ lösning är att försöka klara sig utan addon med hälp av en lokal bindning (w:ws) = words4 cs så att vi får "loss" början till det främsta ordet w och kan lägga iill tecknet c. Men om man har en sträng med ett enda tecken fungerar inte detta om man inte lägger till en femte ekvation. Detta är långt ifrån lätt att inse. words4 :: String -> [String] words4 [] = [] words4 (c:[]) = [[c]] words4 ( : :cs) = words4 ( :cs) words4 ( :cs) = "":words4 cs words4 (c:cs) = (c:w):ws -- med lokal bindning (935 reductions, 1504 cells) where (w:ws) = words4 cs En accumulerande lösning är lättare att förstå: words5 :: String -> [String] words5 str = sp str [[]] -- med hjälpfunktion med accumulator where sp :: String -> [String] -> [String] sp [] acc = reverse acc sp ( : :cs) acc = sp ( :cs) acc sp ( :cs) acc = sp cs ([] : acc) sp (c:cs) (w:ws) = sp cs ((w++[c]):ws) -(1025 reductions, 1834 cells)- En ackumulerande lösning kan också skrivas med foldl : words6 :: String -> [String] words6 str = reverse (foldl sp1 [[]] str) -- Ackumulering med foldl where sp1 :: [String] -> Char -> [String] sp1 ([]:ws) = "":ws -- måste stå först. Varför? sp1 acc = [] : acc sp1 (w:ws) c = (w++[c]):ws -- (1070 reductions, 1882 cells) En del av lösningarna ovan ger ordet "" om stängen slutar med blanktecken, vilket borde åtgärdas. Förvånande att en av mina lösningar verkar vara effektivare än definitionen i Prelude. words har vi användning av i labben om typklasser.

Kap 10. DT Picture. (Float, Float) Vertex : [] [ ]... DT Shape Kap 2 distbetween [Vertex] Polygon Float Side Radius area circle Rectangle RtTriangle square Ellipse Bool Shape String show containss Region Kap 8 containsr Shape Complement Union Intersect (Float, Float) Vector Coordinate Scale Translate Red Magenta Yellow White Region show Empty String Color Over EmptyPic IO() Region draw Black Blue Green Cyan Picture Kap 10 Picture show String Bättre bild i den tryckta upplagan. Vi fortsätter nu bokens "huvudspår". Våra regioner får färg och färgade regioner kan överlappa varandra.

Hur skriver man draw? Åt detta ägnar Hudak större delen av kapitel 10. Han börjar med ytterligare funktioner i SOEGraphics. SOEGraphics kap 10 andregion orregion xorregion diffregion createrectangle createellipse (Int, Int) Point [] : String G.Region createpolygon [Point] drawregion ellipse polygon text Red Magenta Yellow White openwindow Color Graphic withcolor IO Window Black Blue Green Cyan SOEGraphics kap 3 kap 4 drawinwindow Window IO() rungraphics <-

För att kombinera datatypen Picture med funktionerna i SOEGraphics skriver Hudak funktionerna draw och draw2 som använder sig av drawpic som använder sig av drawregioninwindow som använder sig av regiontogregion som använder sig av regtogreg som användersig av shapetogregion. Översiktsbild i den tryckta upplagan.

Kapitel 9. curry och uncurry. Två användbara funktioner (finns förstås i Prelude) : curry :: ((a,b) -> c) -> a -> b -> c curry f x y = f (x, y) uncurry:: (a -> b -> c) -> (a,b) -> c uncurry f (x,y) = f x y Vi kan nu göra sånt som Prelude> uncurry (+) (3, 4) 7 Allting går att göra med funktioner! Tycker du det är märkligt att det fungerar, gör en reduktion av till exempel uncurry (+) (3, 5). Fler exempel. Från tidigare föreläsningsanteckningar har vi en hel del som vi inte hunnit med, t ex en Luleåtenta, övningarna i kapitel 9, övning 5.9, anagram-problemet. Här är ytterligare en tentauppgift: 2. Tentabetyget på en kurs beror på dels antalet poäng p på tentan, 0<= p <= 100, dels på om man har gjort ett labmoment steg9 vilket markeras med G eller _. Tentabetyg ges till de personer som har minst 50 p på tentan. Föjande betygsgränser gäller för dessa: Tentabetyg Tentapoäng p om Tentapoäng p om man gjort steg 9 man inte gjort steg 9 3 50 <= p < 70 50<= p < 75 4 70 <= p < 80 75 <= p < 98 5 80 <= p <= 100 98 <= p <= 100 Skriv ett program tentabetyg :: [(String, Int,Char)] -> [(String, Int)] som givet en lista av typ [(String, Int,Char)] med personers namn, tentamenspoäng och om man gjort steg9 retunerar tentabetyg för de personer som skall ha tentabetyg 3, 4, eller 5. Exempel : res = [("Per", 74, G ), ("Siv", 74, _ ), ("Eva", 95, G )].. >tentabetyg res [("Per",4),("Siv",3),("Eva",5)] a) Skriv programmet utan att använda några högre ordningens funktioner eller listomfattning. b) Skriv programmet med map och filter. c) Skriv programmet med listomfattning. 8p)

Förslag till svar : tentabetyg [] = [] tentabetyg ((namn, p, _ ):nps) p < 50 = tentabetyg nps p < 75 = (namn, 3) : tentabetyg nps p < 98 = (namn, 4) : tentabetyg nps otherwise = (namn, 5) : tentabetyg nps tentabetyg ((namn, p, G ):nps) p < 50 = tentabetyg nps p < 70 = (namn, 3) : tentabetyg nps p < 80 = (namn, 4) : tentabetyg nps otherwise = (namn, 5) : tentabetyg nps tentabetyg _ = error "felaktiga indata" -- 2 a tentabetyg lista = map betyg1 -- b (filter ( \(namn, tentap, steg9) -> tentap > 50) lista) betyg1:: (String, Int, Char) -> (String, Int) betyg1 (namn, p, _ ) p < 75 = (namn, 3) p < 98 = (namn, 4) otherwise = (namn, 5) betyg1 (namn, p, G ) p < 70 = (namn, 3) p < 80 = (namn, 4) otherwise = (namn, 5) betyg1 _ = error "felaktiga indata" tentabetyg lista = -- c [ (namn, betyg tentap steg9) (namn, tentap, steg9) <- lista, tentap >= 50] betyg:: Int -> Char -> Int betyg p _ p < 75 = 3 p < 98 = 4 otherwise = 5 betyg p G p < 70 = 3 p < 80 = 4 otherwise = 5 betyg = error "felaktiga indata" Också kanske på föreläsningen. Grafik med interaktion från labhäftet. Något om kapitel 11 och något om strikta funktioner.