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

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

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

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

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.

Nada Tentamensdag 2004 okt 18 Tentamen Programmeringsparadigm Skrivtid 5 h

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.

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

Del : Paradigmer allmänt.

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

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

Föreläsning 5 i programmeringsparadigm.

Del : Paradigmer allmänt.

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

Föreläsning 4 i programmeringsparadigm.

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

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

DD1361 Programmeringsparadigm. Carina Edlund

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

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

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

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

Haskell forts. 5DV085 - Programspråk. Jan Erik Moström, Department of Computing Science, Umeå University - jem@cs.umu.se

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

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

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

Enjoy Vattenfallsmodellen i funktionella språk

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

Använda Python Laboration 1 GruDat, DD1344

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

Enjoy Vattenfallsmodellen i funktionella språk

TDDC74 Lab 04 Muterbara strukturer, omgivningar

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

TDDC74 Lab 02 Listor, sammansatta strukturer

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

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

HI1024 Programmering, grundkurs TEN

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

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

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

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

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

F4. programmeringsteknik och Matlab

Tentamen i Matematik 2: M0030M.

Diagnostiskt Prov. Antaganden Om förutsättningar saknas I en uppgift skall rimliga antaganden göras och nedtecknas.

Laboration: Grunderna i MATLAB

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Konvexa höljet Laboration 6 GruDat, DD1344

(x + 1) dxdy där D är det ändliga område som begränsas av kurvorna

TENTAMEN. Luleå tekniska universitet

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

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 2

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Dagens föreläsning. Diverse Common Lisp. Konstanter, parametrar, globala variabler

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

Tentamen i Programmering grundkurs och Programmering C

Parametriserade kurvor

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

Laboration: Whitebox- och blackboxtesting

Laboration 1: Figurer i hierarki

Laboration 1 Introduktion till Visual Basic 6.0

Lab5 för prgmedcl04 Grafik

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

Frågorna 1 till 6 ska svaras med ett kryss för varje korrekt påstående. Varje uppgift ger 1 poäng. Använd bifogat formulär för dessa 6 frågor.

TDDC74 Programmering: Abstraktion och modellering Datordugga 2 - exempel

Funktionell programmering DD1361

Övning 1 - Abstrakta datatyper

2D1342 Programkonstruktion för F1, ht 2006

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

Lite skoj - typ. 5DV085 - Programspråk. Jan Erik Moström, Department of Computing Science, Umeå University - jem@cs.umu.se

TDDC74 Programmering, abstraktion och modellering. Tentamen

TDDC74 Programmering, abstraktion och modellering DUGGA 2

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python TDDE24 Funktionell och imperativ programmering del 2

2D1339 Programkonstruktion för F1, ht 2003

Tentamen i. Programmering i språket C

Programkonstruktion. Tentamen,

Grafik i DrRacket AV TOMMY KARLSSON

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Datalogi, grundkurs 1

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

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

Innehåll. Vad är MATLAB? Grunderna i MATLAB. Informationsteknologi. Informationsteknologi.

M0043M Integralkalkyl och Linjär Algebra, H14, Matlab, Föreläsning 1

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 08-12

Planering Programmering grundkurs HI1024 HT TIDAA

DD1311 Programmeringsteknik för S1 Laborationer läsåret

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

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

DIAGNOSTISKT PROV. Tid. Hjälpmedel. Antaganden. Rättning. Övrigt. Diagnostiskt Prov. Klockan Inga

Objektorienterad programmering i Java I

Tentamen i. TDDA 69 Data och programstrukturer

Introduktion till Haskell

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

Tentamen i kurserna Beräkningsmodeller (TDA181/INN110) och Grundläggande Datalogi (TDA180)

TANA17 Matematiska beräkningar med MATLAB för M, DPU. Fredrik Berntsson, Linköpings Universitet. 8 december 2015 Sida 1 / 22

Tentamen i Introduktion till programmering

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

1. Beräkna och klassificera alla kritiska punkter till funktionen f(x, y) = 6xy 2 2x 3 3y 4 2. Antag att temperaturen T i en punkt (x, y, z) ges av

Tentamen, EDAA20/EDA501 Programmering

Transkript:

Nada Tentamensdag 2002-aug-20 Tentamen i Funktionell Programmering Skrivtid 5 h Antalet uppgifter : 5 ( 26p +22p + 14p +26p + 12 p= 100 p ) Lärare, jourhavande lärare : Leif Kusoffsky ------------------------------------------------------------------------------------------------------------------ Tillåtna hjälpmedel: Hudak : The Haskell School of Expression Jones et al : Report on the Programming Language Haskell 98 (Häfte + appendix) övrigt material i kursbunten (Hugs-manualen, Bvs: Datastukturer i Haskell, "Vissa laborationer..") Mina tryckta föreläsningsanteckningar. ----------------------------------------------------------------------------------------------------------------- I alla deluppgifterna, skriv typen för de identifierare du definierar. 1 Bokens (Hudak) uppgift 5.7 sid 73. Define a function that adds "pointwise" the elements of a list of pairs. For example: addpairspointwise [(1, 2),(3, 4),(5, 6)] blir (9,12) a) Vilken typ har addpairspointwise? (Helst så generell som möjligt, "add" är Haskells +. b) Skriv addpairspointwise utan att använda högre ordningens funktioner (och inte som i uppgift e) c) Skriv addpairspointwise med foldr. d) Skriv addpairspointwise med foldl. e) Skriv addpairspointwise med hjälpfunktion med "accumulering i parameter". f) Vilka av lösningarna är minneseffektiva, dvs deluttrycken under reduktionerna är ej O(n) där n är listans längd? 26p) 2 Definiera i Haskell en DT (datatyp) Vector2 (vektorer i planet) med följande operationer: Vector2, -- datatyp för vektorer i planet Vector2, -- Double-> Double->Vector2 Konstuktorfunktion för vektor read, -- String -> Vector2 inläsning på formen Vector2 1.0 2.0 read1, -- (Double, Double) -> Vector2 -- för inläsning på formen read1 (1.0, 2.0) show, -- Vector2 -> String utskrift på formen Vector2 1.0 2.0 show1, -- Vector2 -> (Double, Double) för utskrift på formen (1.0, 2.0) (==), -- Vector2 -> Vector2 -> Bool lika med (/=), -- Vector2 -> Vector2 -> Bool ej lika med add, -- Vector2 -> Vector2 -> Vector2 vektoradditon sub, -- Vector2 -> Vector2 -> Vector2 vektorsubtraktion neg, -- Vector2 -> Vector2 negering lengthv2, -- Vector2 -> Double vektorlängd ( absolutbelopp) o, -- Vector2 -> Vector2 -> Double skalärprodukt -- Tillägsuppgift (+), -- överlagrad operator för add (-), -- överlagrad operator för sub (*), -- ska ge error negate -- överlagrad funktion för negate

Exempel på körningar : Vector2> Vector2 1 (-3)/= Vector2 4 4 True Vector2> Vector2 1 (-3)+ Vector2 4 2 Vector2 5.0 (-1.0) Vector2> Vector2 1 (-3) add Vector2 4 2 Vector2 5.0 (-1.0) Vector2> show1 (read1 (1, -3) + read1 (4, 2)) (5.0,-1.0) Vector2> read1 (1, -2) o read1 (-3, 4) -11.0 22p) 3 a) Definera en typklass Vector med operationerna i Num (abs och frominteger impementeras med error ) och som dessutom har operationerna o (skalärprodukt) och absv (längd för vectorer). b) Hur gör man för att Vector2 i uppgift 2 skall tillhöra typklassen Vector? 14p) I alla uppgifter och deluppgifterna, skriv typen för de identifierare du definierar

4. a) Skriv i FAL (Hudak kap 15, ditt program kan importera det FAL som användes i laborationen och använder mm istället för tum) ett program Hunt som gör att en blå ellips kan styras i ett grafiskt fönster. Elippsens läge ges av s = ( a dt ) dt + s0 10p) där fet stil betyder vektorer i planet och båda komponeterna. integrering av vektorer i planet, dvs integering av Elippsen acceleration a= (accx, accy) är från början a= (0.0, 0.0), men varje gång man trycker på tangenten i ökar accx med 1.0, accy oförandrad varje gång man trycker på tangenten m minskar accx med 1.0, accy oförandrad varje gång man trycker på tangenten k ökar accy med 1.0, accx oförandrad varje gång man trycker på tangenten i minskar accy med 1.0, accx oförandrad andra tangentryckningar accy oförandrad,accx oförandrad Tips: Du kan ha glädje av Hudaks program color3 och color 4 på sid 212. Svaret kan ingå i svaret på b) eller c). b) Modifiera lösningen i a) så det grafisk fönstret även visar en gul ellips som rörs sig analogt med den blå ellipsen men styrs av e, x, s, d. Märk att tangenterna bildar följande mönster: e i s d j k x m Styr gul ellips Styr blå ellips Programmet kan nu användas som ett spel för två personer som styr varsin ellips, t ex ett samarbetspel där spelarna försöker få sina ellipser att mötas eller ett spel där blå ellips jagar gul ellips. Tips: Svaret kan ingå i svaret på c). c) Modifera lösningen i b) så att när ellipserna är mindre än 5 mm från varandra de"parkeras" nära varandra i det grafiska fönstrets mitt och ej längre rör sig. 26p) Bifogas : Översikt av FAL.

5. a) Alla traditionella grafiska interaktiva program som växelvis ritar på skärmen och reagerar på klickningar fungerar på så sätt att programmet befinner sig i ett startillstånd av godtycklig typ a, därefter sker detta: En första gång och sedan gång på gång så länge programmet skall fortsätta: rita på skärmen Vänta på klickningen, man får koordinater i "pixels", origo upptill till vänster, av typ (i, j) :: Input, type Input = (Int, Int) kör en funktion f :: a {-status-} -> Input -> (a, [Graphic]) som retunerar ett par (ny status av typ a, nya bilder av typ [Graphic]) ) Detta kan programmeras en gång för alla med funktionera main, makegraphicinteractive, och loop : module GraphicInteract where -- finns på /info/progp02/haskell/graphicinteract.hs import SOEGraphics makegraphicinteractive :: a -> String {- föntertittel-} -> (Int, Int) {- fönsterstorlek -}->[Graphic] {-startbilder-} -> (a -> (Int,Int) -> (a,[graphic])) {- förändringsfunktion-}-> IO () makegraphicinteractive startstatus title (isize, jsize) firstgraphs f = rungraphics (do w <- openwindow title (isize, jsize) loop w startstatus firstgraphs f ) Skriv funktionen loop :: Window -> a -> [Graphic] -> (a -> (Int,Int) -> (a,[graphic])) -> IO b (Min lösning på är 5 rader.) Raderna i makegraphicinteractive och loop är all "IO Monad"-programmering som behövs. Genom att använda makegraphicinteractive kvarstår bara att definiera argumenten som motsvarar parametern f, startillståndet och de första bilderna (en bild har typen Graphic) som är vanliga "monadfria" funktionella program/värden, så får man ett grafiskt växelvis interaktiva program. b) Skulle makegraphicinteractive kunna användas för att programmera schack-labben? Labyrintlabben? 12p)

Förfrågan: Kan du tänka dig att vara labbassistent under läsperiod 1 i kursen programmeringsparadigemer i D2? Kryssa gärna i ett eller båda alternativen. (Naturligtvis ej bindande) O I Haskelldelen av kursen O I Prologdelen av kursen Hur kan jag kontakta dig (tex e-pos, tel ):

Förslag till svar tentamen i Funktionell Programmering 2D1370 2002-aug-20 addpairspointwise ::(Num a, Num b) => [(a,b)] -> (a,b) -- 1 a addpairspointwise [] = (0, 0) -- b addpairspointwise ((x, y) : xys ) = (x+xs, y+ys) where (xs, ys) = addpairspointwise xys addpairspointwise = foldr (\(x, y) -> \(xs, ys) -> (x+xs, y+ys)) (0, 0) -- addpairspointwise = foldl (\(xs, ys) -> \(x, y) -> (xs+x, ys+y)) (0, 0) -- c d addpairspointwise xys = app xys (0,0) -- e where app :: (Num a, Num b) => [(a,b)] -> (a,b) -> (a,b) app ((x, y) : xys) (xs, ys) = app xys (xs+x, ys+y) app [] (xs, ys) = (xs, ys) d) och e) använder uttryck som ej växer med listans längd -- f -- 2 module Vector2 ( Vector2, -- datatyp för vektorer i planet Vector2, -- Double-> Double->Vector2 Konstuktorfunktion för vektor read, -- String -> Vector2 inläsning på formen Vector2 1.0 2.0 read1, -- (Double, Double) -> Vector2 -- för inläsning på formen read1 (1.0, 2.0) show, -- Vector2 -> String utskrift på formen Vector2 1.0 2.0 show1, -- Vector2 -> (Double, Double) för utskrift på formen (1.0, 2.0) (==), -- Vector2 -> Vector2 -> Bool lika med (/=), -- Vector2 -> Vector2 -> Bool ej lika med add, -- Vector2 -> Vector2 -> Vector2 vektoradditon sub, -- Vector2 -> Vector2 -> Vector2 vektorsubtraktion neg, -- Vector2 -> Vector2 negering lengthv2, -- Vector2 -> Double vektorlängd ( absolutbelopp) o, -- Vector2 -> Vector2 -> Double skalärprodukt -- Tillägsuppgift (+), -- överlagrad operator för add (-), -- överlagrad operator för sub (*), -- ska ge error negate -- överlagrad funktion för negate ) where data Vector2 = Vector2 Double Double deriving (Eq, Show, Read) add :: Vector2 -> Vector2 ->Vector2 add (Vector2 x1 y1) (Vector2 x2 y2) = Vector2 (x1+x2) (y1+y2) sub:: Vector2 -> Vector2 ->Vector2 sub v1 v2 = add v1 (neg v2) neg :: Vector2 -> Vector2 neg (Vector2 x y) = Vector2 (-x) (-y) lengthv2 :: Vector2 -> Double lengthv2 (Vector2 x y) = sqrt (x*x + y*y) read1 :: (Double, Double) -> Vector2 read1 (x, y) = Vector2 x y show1 :: Vector2 -> (Double, Double) show1 (Vector2 x y) = (x, y)

o :: Vector2 -> Vector2 -> Double o (Vector2 x1 y1) (Vector2 x2 y2) = (x1*x2 + y1*y2) instance Num Vector2 where (+) = add (*) = error "No * on vectors" negate = neg abs = error "abs" frominteger i = error "frominteger" class Num a => Vector a where o :: a -> a -> Double absv :: a -> Double -- 3 a -- Skriv i filenvector2.hs -- b instance Vector Vector2 where o (Vector2 x1 y1) (Vector2 x2 y2) = (x1*x2 + y1*y2) absv = lengthv2 -- o får inte definieras på annat ställe i filen, dvs tas bort i svaret på 2. module Hunt where -- 4 import Picture(Picture, Region, containsr) import Fal main :: IO() main = test ( (ell1) over (ell2) ) ellb :: Behavior Region ellb = ell 3 4 ell1, ell2 :: Behavior Picture ell1 = paint yellow ((translate pos1 ellb) untilb (smash ->> translate (0.0, 0.0) ellb )) ell2 = paint blue ((translate pos2 ellb) untilb (smash ->> translate (5.0, 0.0) ellb )) pos1, pos2 :: (Behavior Float,Behavior Float) pos1 = integral2 (integral2 (accx1, accy1)) addpairb (0.0, 40.0) pos2 = integral2 (integral2 (accx2, accy2)) addpairb (0.0, -40.0) accx1, accy1, accx2, accy2 :: Behavior Float accx1 = (0.0 switch (key snapshot accx1 =>> \(c, old) -> case c of s -> lift0 old - 1.0 d -> lift0 old + 1.0 _ -> lift0 old )) accy1 = (0.0 switch (key snapshot accy1 =>> \(c, old) -> case c of x -> lift0 old - 1.0 e -> lift0 old + 1.0 _ -> lift0 old )) accx2 = (0.0 switch (key snapshot accx2 =>> \(c, old) -> case c of j -> lift0 old - 1.0 k -> lift0 old + 1.0 _ -> lift0 old ))

accy2 = (0.0 switch (key snapshot accy2 =>> \(c, old) -> case c of m -> lift0 old - 1.0 i -> lift0 old + 1.0 _ -> lift0 old )) integral2 :: (Behavior Float, Behavior Float) -> (Behavior Float, Behavior Float) integral2 (bx, by) = (integral bx, integral by) addpairb :: (Num a, Num b) => (b,a) -> (b,a) -> (b,a) addpairb (a1, b1) (a2, b2) = (a1+a2, b1+ b2) hit :: (Behavior Float, Behavior Float) -> (Behavior Float, Behavior Float) -> Behavior Bool hit (mx, my) (sx,sy) = (abs(mx-sx) <*5) &&*(abs(my-sy)<*5) smash :: Event () smash = when (hit (pos1) (pos2)) -- 5 loop w status graphs f = do sequence_ (map (drawinwindow w) graphs) (x, y) <- getlbp w let (status1, graph1s ) = f status (x,y) loop w status1 graph1s f -- Schacklabben ja, men inte labyrintlabben, som ju är äkta reaktiv ("realtid") -- och inte växelvis interaktiv.