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



Relevanta dokument
Senast. Idag. Strikt evaluering. Icke-strikt evaluering. Vad händer här? Lat evaluering. Testa latheten! Testa latheten!

Senast. Idag. Strikt evaluering. Icke-strikt evaluering. Vad händer här? Lat evaluering. Testa latheten! Testa latheten!

Introduktion till Haskell

Intro. Vad är en monad?

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.

Funktionell programmering DD1361

DD1361 Programmeringsparadigm. Carina Edlund

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

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

Övning 1 - Abstrakta datatyper

Programmering II (ID1019) :00-11:00

Dagens föreläsning Programmering i Lisp Fö 7. Sammanfattning funktionell programmering Exempel på funktionella programspråk

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

Sätt att skriva ut binärträd

Tentamen i Introduktion till programmering

Dugga Datastrukturer (DAT036)

En kort text om programmering i C.

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.

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

Det finns många flaggor till g++,

PROGRAMMERING-Java Omtentamina

Föreläsning 3: Booleans, if, switch

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

Programmering II (ID1019) :00-12:00

Introduktion till programmering SMD180. Föreläsning 9: Tupler

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Exempelsamling Assemblerprogrammering

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Objektsamlingar i Java

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Sammanfattning. Listor. List-manipulering. Matris. /home/lindahlm/activity-phd/teaching/11dd1310/exercise3/exercise3.py September 13, 20111

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

Föreläsning Datastrukturer (DAT036)

Datalogi, grundkurs 1

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

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Introduktion till programmering SMD180. Föreläsning 7: Strängar

Generiska konstruktioner. Kursbokens kapitel 13

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Tentamen i Algoritmer & Datastrukturer i Java

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

Olika shell. Skalprogrammering. Pipor och omdirigering av strömmar

Omkoppling av in- och utmatning. In- och utmatning i Unix. Kommando exempel, ls, pipe forts. Kommando exempel, ls, pipe

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python

Tillämpad Programmering (ID1218) :00-13:00

Grundläggande datalogi - Övning 1

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Funktionell programmering

grundläggande C++, funktioner m.m.

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

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

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

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

Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA

Operatoröverlagring. endast operatorsymboler definierade i C++ kan överlagras = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && > ->*, [ ] ( )

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Programmering II (ID1019) :00-11:00

OMTENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

Enjoy Vattenfallsmodellen i funktionella språk

Unix design. Unix är ett operativsystem från mellan 1969 och 1972, beroende på hur man räknar. Unix utvecklas fortfarande.

Generics och polymorfism. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

HI1024 Programmering, grundkurs TEN

Rekursion och induktion för algoritmkonstruktion

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

Enjoy Vattenfallsmodellen i funktionella språk

"Referentiell transparens"

Laboration: Whitebox- och blackboxtesting

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

Datalogi för E Övning 3

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

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Hur man programmerar. Exempel på problemlösning i Python

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Platser för att skriva och testa kod online. Workshop om programmering i matematikkurser, version 0.7 senast sparat

1 Klasser och objektorientering Vad är objektorientering?

Tentamen i Algoritmer & Datastrukturer i Java

Imperativ programmering. Föreläsning 4

Använda Python Laboration 1 GruDat, DD1344

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Objektorienterad Programmering (TDDC77)

Konvexa höljet Laboration 6 GruDat, DD1344

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

729G04 Programmering och diskret matematik. Python 3: Loopar

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

Föreläsning 8: Exempel och problemlösning

Programmering II (ID1019)

EnKlass. Instans 3 av EnKlass. Instans 2 av EnKlass

Signalflödesmodellen. Två (gamla) exempel: Kvadratera alla jämna löv.

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 1 Jonas Lindgren, Institutionen för Datavetenskap, LiU

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

Repetition C-programmering

printenv sort pager printenv grep args sort pager

DAT043 - föreläsning 8

TDP002 Imperativ programmering

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

Transkript:

Senast Idag Högre ordningens funktioner Listomfattning Strikthet och lat evaluering Strömmar Monadisk I/O Strikt evaluering Icke-strikt evaluering Def: Strikt evaluering innebär att alla parametrars värde är kända när en operator eller funktion anropas. Ex: Funktionsanrop i Java, C, etc Hur beräknas if jobbigt(7) && tungt(47) then...? Vanligen: Man kortsluter jämförelsen. Implementeras för and och or Lat evaluering Testa latheten! Hur beräknas head [..0]? head (qsort longlist)? Lat evaluering i Haskell: Beräkna bara det som behövs Varje uttrck lagras som ett löfte om evaluering vid behov. Vad händer med head (qsort [9,5,4,,2,9])? Instrumentera koden: qsort [] = [] qsort (x : xs) = qsort [(observe e e) e<-xs, e<x] ++ [(observe x x)] ++ qsort [(observe e2 e) e<-xs, e>=x] Testa latheten! Plus och minus med lat evaluering Hugs> head (qsort [4, 5, 4, 3,, 2,9]) >>>>>>> Observations <<<<<< e 3 2 2 x Hugs> Inga värden på e2 det uttrcket har aldrig behövt evalueras Nackdelar: Fördelar: Kan slöa ner ett program (använd då explicit strikt evaluering!) Kan slösa på minne: löftet tar plats Överraskande för den ovetande? Kan snabba upp ett program Undviker onödiga beräkningar. Automatiskt! Erbjuder smarta uttrckssätt.

Valfri strikthet Operatorn ($!). Ersätta f x med f $! x tvingar x att evalueras först. Anpassade funktioner, exv foldr. Strikta datatper, exv data StrictColor = SRGB!r!g!b lagrar inga löften Användning av lat evaluering Vad händer med... ones = ( : ones)? Hugs> ones [... take 0 ones? Hugs> take 0 ones [,,,,,,,,,] lst = ( : map ((+) ) lst)? Hugs> take 0 lst [,2,3,4,5,6,7,8,9,0] Inbggt i Haskell: [..] == lst Mer exempel lst2 = concat (map (\x -> [x,-x]) lst) Hugs> take 0 lst2 [,-,2,-2,3,-3,4,-4,5,-5] Hur ta fram alla tal-par? allpairs = [(x, ) x <- [..], <- [x, (x-)..]] Hugs> take 0 allpairs [(,),(2,2),(2,),(3,3),(3,2),(3,), (4,4),(4,3),(4,2),(4,)] Strömmar: Oändliga listor Tpexemplet: Fibonaccitalen Antag att fibs är listan av Fibonaccital. 2 3 5 8 3 2... fibs + 2 3 5 8 3 2 34... tail fibs 2 3 5 8 3 2 34 55... tail(tail fibs) fibs = ::(elementwiseadd fibs (tail fibs)) where elementwiseadd = zipwith (+) Hugs> take 0 fibs [,,2,3,5,8,3,2,34,55] Pseudoslumptal i Haskell Ett sätt att generera pseudoslumptal: Ström av pseudoslumptal: Måste skickas med överallt. module MinSimulator where import Random prng :: Int -> Int -> [Int] prng n seed = randomrs (0,n-) (mkstdgen seed) Hugs> :load MinSimulator Hugs> take 0 (prng 00 47) [37,92,38,24,22,60,2,24,38,6] Hugs> runsimulation start (prng 00 47) Strömmar i Unix Antag du snabbt måste radera många filer: $ rm -r MinaHemligaMP3 rm: remove write-protected file final_countdown.mp3? rm: remove write-protected file BestOf80s.zip? rm: remove write-protected file trackslistan85.zip?... Två tips:. Använd rm -rf! 2. eller använd es $ es rm -r MinaHemligaMP3 Vad gör es? Programming pearls $ es......tills mottagande programmet avslutas och strömmen stängs. Latheten följer av I/O-buffertar! Klassisk artikelserie i Communications of the ACM, Jon Bentle. Idén: Låt en stjärna lösa ett problem och låt en annan stjärna kritisera den. 986: Given a text file and an integer k, ou are to print the k most common words in the file (and the number of occurrences) in decreasing frequenc. Donald Knuth fick uppdraget.

Knuths lösning Elegant programmering Elegant specialdesignad datastruktur (prefixträd) Noggrant kommenterat och presenterat Kritikern, Doug McIlro, AT&T Bell Labs: Ver few people can obtain the virtuoso services of Knuth [...] to attack problems such as Bentle s from the ground up. But old Unix hands knows instinctivel how to solve this one in a jiff. (McIlro uppfann pipes i Unix.) Strömmar som paradigm McIlros lösning: strömmar i Unix $ cat MittLitteräraVerk.txt tr -cs A-Za-z ˆj # Radbrtningar tr A-Z a-z # Versaler blir gemena sort # Sortera orden uniq -c # Samla ihop och räkna sort -rn # Sortera efter antal head -n 0 # Visa de första 0 Problemet med I/O Uttrcksfullt, snggt Kräver nån sorts lathet God ingenjörskonst! Läs från stdin Skriv till stdout Felmeddelanden till stderr I/O ej funktionellt getchar plockar bort ett tecken från en nån buffert putchar skriver in ett tecken i en buffert. Hur åstadkomma I/O utan sideffekter? Lisp mfl: Fuska! Använd sidoeffekter. Haskell mfl: Kapsla in världen på ett säkert sätt Teater Ansats: Kapsla in världen Pseudokod: main = printstr("rev: ") printstr(reverse(getline))...i imperativt program: Alla delar på världen....i funktionellt program: En funktion är gränssnittet mot världen. Vad vi vill ha: tpe IO a = World -> (a, World) IO-tper är handlingar: Eng: actions Exempel: getchar :: IO Char getchar :: World -> (Char, World) putchar :: Char -> IO () putchar :: Char -> World -> ((), World) iseof getline :: IO Bool :: IO String Sammanfogning av IO Sammanfogning av IO Lim: >>= (och >>) (>>=) :: IO a -> (a -> IO b) -> IO b Exempel : echo :: IO () echo = getchar >>= putchar Tper: a = Char, b = () Lim: >>= (och >>) (>>=) :: IO a -> (a -> IO b) -> IO b Paketering: Konstruktor return return :: a -> IO a Exempel 2: gettwochars :: IO (Char, Char) gettwochars = getchar >>= \c -> getchar >>= \c2 -> return (c, c2)

Vårt teater-exempel: Reverse Sntaktiskt socker: do main = getline >>= (\s -> return (reverse s) >>= (\r -> putstrln r)) main = getline >>= \s -> return (reverse s) >>= \r -> putstrln r Idé: Automatisera sammankopplingen av IO-uttrck Regler: do {x <- e; s e >>= \x -> do {s do e; s e >> do s do e e Exempel: gettwochars = do { c <- getchar; c2 <- getchar; return (c, c2) Lättare att uttrcka sig med do Vårt reverse-program igen: main = do { s <- getline; r <- return (reverse s); putstrln r Eller ännu enklare: main = do { s <- getline; putstrln (reverse s) Exempel: getline getline :: IO [Char] getline = do { c <- getchar; if c == \n then return [] else do { cs <- getline; return (c : cs) Exempel: Räkna tecken och rader Exempel: Räkna tecken och rader Enkel implementation av wc: main = do {(nlines, nchars) <- wc 0 0; putstrln (show nlines ++ "\t" ++ show nchars) wc :: Int -> Int -> IO (Int, Int) wc nlines nchars= do flag <- iseof if flag then return (nlines, nchars) else consumeandcount nlines nchars consumeandcount :: Int -> Int -> IO (Int, Int) consumeandcount nl nc = do { c <- getchar; if (c == \n ) then wc ( + nl) ( + nc) else wc nl (+nc) Hugs> wc 0 0 Hugs> main 6 Hugs> I terminalen: $ runhugs wc.hs bubba 2 2 $ Testa programmet Designprincip för I/O i Haskell Världen Monadisk IO Programlogiken Filer getchar mpreparations Portar getline computeitall stdin/stdout openfile mfilter Grafik readfile iseof m.m.

Lura Haskell... med unsafeperformio Slutsatser? Ett trick för att komma runt monadreglerna: unsafeperformio :: IO a -> a Använd inte för F4 eller på tenta... Peton-Jones: Riktigt obekväm I/O, Once-per-run I/O Debugging: trace :: String -> a -> a trace s x = unsafeperformio (putstrlns s >> return x)... men vi har ju Hugs.Observe! Nackdelar: Fördelar: Krångligt! Tvångströja Separation av I/O och funktionalitet uppmuntras Teoretisk välgjort gör programbevis enklare Monaden Mabe Monaden Mabe Idén: data Mabe a = Just a Nothing Minns lookup: lookup :: Eq a => a -> [(a, b)] -> Mabe b Hugs> lookup [(,"KTH"), (2, "Chalmers")] Just "KTH" Hugs> lookup 5 [(,"KTH"), (2, "Chalmers")] Nothing Bra till enkel felhantering: colorfromstring :: String -> Mabe Color colorfromstring s = s == "red" = Just (RGB 255 0 0) s == "green" = Just (RGB 0 255 0) s == "blue" = Just (RGB 0 0 255) otherwise = Nothing Hugs> colorfromstring "red" Just (RGB 255.0 0.0 0.0) Hugs> colorfromstring "black" Nothing