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

Relevanta dokument
DD1361 Programmeringsparadigm. Carina Edlund

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

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

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

Objektorienterad Programmering (TDDC77)

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

Objektorienterad Programmering (TDDC77)

Objektorienterad Programmering (TDDC77)

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

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

Övning2. Variabler. Data typer

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Introduktion till Haskell

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

System.out.println("Jaså du har "+ antalhusdjur+ " husdjur"); if ( antalhusdjur > 5 ) System.out.println("Oj det var många);

DD1314 Programmeringsteknik

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

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

Användarhandledning Version 1.2

Tentamen OOP

Innehållsförteckning. Exempel. Åtkomst & användarhandledning

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

//Använd main som ett "handtag" för att hålla ihop programmet. //Själva programmet finns i övriga klasser.

Översikt MERA JAVA OCH ECLIPSE. Uttryck och tilldelning. Uttryck och tilldelning. Uttryck och tilldelning. Uttryck och tilldelning

Grundläggande programmering DVG A08 & ISG A04. Allmän information. Å vem är jag då. Karlstads Universitet, Johan Öfverberg 1

Filbindningar. Mike McBride Översättare: Stefan Asserhäll

Språket Python - Del 1 Grundkurs i programmering med Python

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

Konvertering från sträng. Winstrand Development

Laboration: Whitebox- och blackboxtesting

l uppgiftsformulering l algoritmkonstruktion l verifikation l kodning l testning och avlusning l validering l dokumentering l underhœll Kapitel 2

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?

JavaScript del 3 If, Operatorer och Confirm

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

OOP Objekt-orienterad programmering

Extramaterial till Matematik Y

Programmering A. Johan Eliasson

SMD 134 Objektorienterad programmering

Eclipse. Kort genomgång

Uppgift 1 ( Betyg 3 uppgift )

Föreläsning 1 & 2 INTRODUKTION

Standardlösningar: sekventiell sökning

JAVAUTVECKLING LEKTION 4

Introduktion till programmering SMD180. Föreläsning 3: Funktioner

RiWiCon Hovslagare. Import från HippoHov. Kontakter, Hästar, Journalposter Version 1.3.x

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

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

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

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

Sätt att skriva ut binärträd

TDIU01 - Programmering i C++, grundkurs

Enjoy Vattenfallsmodellen i funktionella språk

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

NetBeans 5.5. Avsikt. Projektfönster

Jag försöker hämta in video via Ulead programmet men får bara in bilden och inget ljud.

OOP F1:1. Föreläsning 1. Introduktion till kursen OOP Vad är Java? Ett första Java-program Variabler Tilldelning. Marie Olsson

Drivrutinen DrvTC2 används för att kommunicera via ADS och PLC:er från Beckhoff.

Enjoy Vattenfallsmodellen i funktionella språk

Anteckningar 1: Grundläggande saker

BaraTrav Prenumeration och Installation Version 1.3.4

Föreläsning 9 i programmeringsparadigm. Unifiering (Brna Chapter 4.1).

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Föreläsning 5: Introduktion av pekare

Styrteknik: MELSEC FX och numeriska värden

Programmeringsteknik med C och Matlab

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

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

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

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

Programmering A C# VT Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson

TDIU01 (725G67) - Programmering i C++, grundkurs

Laboration 10 - NetBeans

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

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

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

Variabler och konstanter

Föreläsning 3. Programmering, C och programmeringsmiljö

Objektorienterad programmering Föreläsning 4

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

TDDC77 Objektorienterad Programmering

Ordlistor, filhantering och ut på webben. Linda Mannila

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

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Strukturdiagram. Styra. Algoritmer. Val

Grundläggande datalogi - Övning 1

Denna handledning är skriven för soss-7.0.3

Smartair System. TS1000 Version 4.23

Obligatorisk uppgift: Numerisk kalkylator

kl Tentaupplägg

Föreläsning 1 & 2 INTRODUKTION

Planering av ett större program, del 2 - for och listor. Linda Mannila

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Loopar och objekt i JavaScript

Jobbschemaläggare. Morgan N. Sandquist Utvecklare: Gary Meyer Granskare: Lauri Watts Översättare: Stefan Asserhäll

Programmering B med Visual C

Transkript:

Funktionell programmering Haskell Ge#ng started...

Installera Haskell För a/ installera Haskell på egen maskin, ladda ned Haskell Pla9orm från h/p://www.haskell.org/pla9orm/ Där finns instrukdoner, dokumentadon, etc. Den interakdva tolken startas med kommandot ghci $ ghci GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help Loading package ghc- prim... linking... done. Loading package integer- gmp... linking... done. Loading package base... linking... done. Prelude>

GHCi som kalkylator Här kan man skriva in u/ryck som utvärderas och resultatet skrivs ut Prelude> 6 * 7 42 Prelude> sqrt 2 1.4142135623730951 Prelude> 2^8 256

Bindningar i GHCi Det är möjligt a/ göra Dllfälliga bindningar av värden Dll namn med hjälp av let OBS! Bindningar är inte variabler. Det är inte möjligt att ändra värdet, bara att binda ett annat till samma namn. Tidigare beräkningar påverkas inte. Prelude> let tau = 2 * pi Prelude> let unitcircumference = tau * 1 Prelude> unitcircumference 6.283185307179586 Prelude> let tau = 17 Prelude> unitcircumference 6.283185307179586

Att arbeta med GHCi Det förmodade arbetsflödet är a/ skriva definidoner i filer som laddas i GHCi OBS! Ställ in editorn du använder på a/ använda mellanslag för indragningar, inte tabbar Filer laddas med kommandot :load och kan sedan laddas om med :reload

Att ladda :iler Givet en fil med namnet Temps.hs och följande innehåll: convconst = 273.15 (nu behövs inte let ) Kan den laddas och användas på följande sä/: Prelude> :load Temps.hs [1 of 1] Compiling Main ( Temps.hs, interpreted ) Ok, modules loaded: Main. *Main> convconst 273.15 *Main> 0 - convconst - 273.15 *Main> 100 - convconst - 173.14999999999998

En första funktion DefiniDonen placeras i filen Temps.hs kommentar - - konvertera Kelvin till grader Celsius celsius x = x - convconst funkdonens namn namn på argument u/ryck för a/ räkna ut resultatet

Att använda funktionen *Main> :reload [1 of 1] Compiling Main ( Temps.hs, interpreted ) Ok, modules loaded: Main. *Main> celsius 0-273.15 *Main> celsius 100-173.14999999999998

Konvertera andra vägen - - konvertera grader Celsius till Kelvin kelvin x = x + convconst *Main> :reload [1 of 1] Compiling Main ( Temps.hs, interpreted ) Ok, modules loaded: Main. *Main> kelvin 0 273.15 *Main> celsius (kelvin 0) 0.0

Testning och egenskaper Vi kan u/rycka en allmän egenskap om vad som förväntas hända när man konverterar fram och Dllbaka prop_celsiuskelvin x = celsius (kelvin x) == x Det här är en vanlig funktion som uttrycker en egenskap som förväntas hålla oberoende av värdet på x *Main> :reload [1 of 1] Compiling Main ( Temps.hs, interpreted ) Ok, modules loaded: Main. *Main> prop_celsiuskelvin 0 True *Main> prop_celsiuskelvin 42 True

Att skriva egenskaper i :iler KonvenDon: Namnet på funkdoner som u/rycker en egenskap börjar med prop_ (från property) och förväntas vara sanna (utvärderas Dll värdet True oberoende av argumentens värden) För a/ automadskt testa dessa används e/ bibliotek som heter QuickCheck Det kan importeras i filer med: import Test.QuickCheck eller i GHCi: :module +Test.QuickCheck

Att köra test *Main> :reload [1 of 1] Compiling Main ( Temps.hs, interpreted ) Ok, modules loaded: Main. *Main> quickcheck prop_celsiuskelvin *** Failed! Falsifiable (after 2 tests and 1 shrink): 8.316199327150231e- 2 De/a är en klassiskt problem med fly/alsaritmedk och logiska jämförelser

Lösning på problemet Resultatet ska vara nästan det samma Det räcker a/ skillnaden är Dllräckligt liten, säg <0.000001 Vi kan använda operatorn < för a/ jämföra storlek *Main> 4 < 7 True *Main> 7 < 4 False *Main> 3 < 3 False

De:inition av nästan lika epsilon = 0.000001 x ~== y = x y < epsilon definierar operatorn ~== med argumenten x och y som utvärderas Dll True om skillnaden mellan värdena är Dllräckligt liten

Testa ~== *Main> 2 ~== (2 + epsilon) True *Main> 2 ~== 3 True *Main> 3 ~== 2 False Vad är problemet? (Svar på nästa sida...)

Testa ~== x ~== y = abs(x - y) < epsilon

Korrekt egenskap prop_celsiuskelvin x = celsius (kelvin x) ~== x *Main> prop_celsiuskelvin 0 True *Main> prop_celsiuskelvin 42 True *Main> prop_celsiuskelvin (- 10) True *Main> quickcheck prop_celsiuskelvin +++ OK, passed 100 tests.

Typer Hi#lls har vi inte behövt bry oss om datatyper, men om man gör följande så stöter man på problem. *Main> let utetemp = 15 *Main> kelvin utetemp <interactive>:32:8: Couldn't match expected type `Double' with actual type `Integer' In the first argument of `kelvin', namely `utetemp' In the expression: kelvin utetemp In an equation for `it': it = kelvin utetemp Vad är det som händer?

Typinformation i GHCi Vi kan använda tolken för a/ ta redan på vilken typ värden har *Main> :type utetemp utetemp :: Integer *Main> :type convconst convconst :: Double *Main> :type celsius celsius :: Double - > Double pilen anger a/ det är frågan om en funkdonstyp *Main> :type True True :: Bool

Typinferens Genom en process som kallas typinferens beräknas den slutgildga typen för e/ u/ryck Den förväntade typen kan påverka beräkningen av värdet Operatorn :: läses har typen och kan användas för a/ tvinga resultatet a/ ha en given typ *Main> 2^42 :: Double 4.398046511104e12 *Main> 2^42 :: Integer 4398046511104

Typkontroll Använder typinferens för a/ beräkna den förväntade typen Kontrollerar a/ alla typsignaturer passar ihop före programmet körs

Varför fungerade allt tidigare? Tal kan anta flera typer, men när de binds Dll e/ namn fixeras typen Prelude> 15 :: Integer 15 Prelude> 15 :: Double 15.0 Prelude> let utetemp = 15 Prelude> :type utetemp utetemp :: Integer Prelude> utetemp :: Double <interactive>:16:1: Couldn't match expected type `Double' with actual type `Integer' In the expression: utetemp :: Double In an equation for `it': it = utetemp :: Double

Lösningar på problemet Man kan andngen ange den typ som önskas vid bindningsdllfället I GHCi: let utetemp = 15 :: Double I filer: utetemp :: Double utetemp = 15 AlternaDvt kan funkdoner som möjliggör typkonvertering användas *Main> kelvin (fromintegral utetemp) 288.15