K08 Haskell 1. GrundlegendeEigenschaften 2. GHCi undGHC 3. Typsystem teilweisebasiertaufFolienvonGrahamHutton undPhilipWadler thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 2 Haskell Literatur n M.Block,A.Neumann:Haskell-Intensivkurs:Ein kompakterEinstiegindiefunktionaleProgrammierung. Springer,2011.ISBN:978-3-642-04717-6 Frei/onlineverfügbar: n n B.O'Sullivan,D.Stewart,J.Goerzen:RealWorldHaskell. FirstEdition.O‘Reilly, 2008.ISBN:978-0-596-514983http://book.realworldhaskell.org/ M.Lipovača:Learn You aHaskell for GreatGood! No Starch Press,2011.ISBN:978-1-59327-283-8 http://learnyouahaskell.com/ thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 3 HistorischerHintergrund n Ursprung: n n n n λ-Kalkül(A.CHURCH undS.KLEENE – 1930erJahre) Currying*(HASKELL BROOKS CURRY – 1950erJahre) LispalsersteProgrammiersprachemitfunktionalen Eigenschaften(J.MCCARTHY 1958) Haskell 1.0– (P.HUDAK,J.HUGHES,SIMON P.JONES,P.WADLER 1990);aktuelleVersion:Haskell 2010 *ZuvorschonvonG.FREGE undM.SCHÖNFINKEL beschrieben. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 4 IstFPrelevant? n VieleKonzeptederFPfindenEinganginden„Alltag“der Softwareentwicklungbzw.indieWeiterentwicklung konventionellerSprachen: xmonad PUGSPERL6 Compiler Projekte,dieinHaskellgeschrieben sind (Auswahl) GoogleMapReduce Übersicht:http://www.haskell.org/haskellwiki/Haskell_in_industry thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 5 WarumgeradeHaskell undnicht... ...Erlang,F#,Lisp,ML,O‘Caml,Scheme,Scala,... n ReinfunktionaleSprache– „purely functional“ n UnterdenfunktionalenProgrammiersprachensehrpopulär n n n CompileralsauchinteraktiveInterpreterverfügbar(z.B. GlasgowHaskell Compiler ghc undghci) n n n Grosse MengeanBibliotheken NichtnurGegenstandderForschung,sondernindustrielleingesetzt (mansollteesnichtalseine„akademischeSpielwiese“auffassen) GutebissehrguteLaufzeitperformancewennkompiliert ToolsfürEntwickler(IDEs,Debugger,Build,Profiler) EntworfendurcheinKomitee thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 6 WasistFunktionaleProgrammierung? Allgemeinzusammengefasst: n Programmierstil(Paradigma)dessengrundlegendeMethodedie Anwendung vonFunktionen aufderenArgumente ist: EinProgrammistformuliertalseine(möglicherweiseausvielen Unterfunktionenzusammengesetzte)Funktion(immath.Sinn), dessenAusführungderAuswertungdieserFunktionentspricht. n EinefunktionaleProgrammiersprache unterstützt /fördert /erzwingt diesenProgrammierstil. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 7 Gegenüberstellung n Gesucht:SummieredieZahlen1...10! Funktion Argument InC++: InHaskell: int sum = 0; sum [1..10] for (int i=1; i<=10; i++) { sum += i; } sum sum sum sum Imperativ:IteriereüberdieZahlen 1bis10undaddieredieaktuelle ZahlzurGesamtsumme. Applikativ:WendedieFunktion sum aufdieListederZahlen1bis 10an,wobeisum dieFunktionist, diedieSummeeinerListevon Zahlenberechnet. :: Num [] [x] (x:xs) a = = = => [a] -> a 0 x x + sum [xs] thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 8 Funktionsanwendungund-Komposition graustufen :: Bild -> Bild springer :: Bild graustufen graustufen springer spiegeln :: Bild -> Bild neben :: Bild -> Bild -> Bild neben (spiegeln springer) (graustufen springer) graustufen neben spiegeln duplizieren thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 9 NeueFunktionausbestehendenFunktionendefinieren graustufen neben spiegeln duplizieren duplizieren :: Bild -> Bild duplizieren x = neben (spiegeln x) (graustufen x) duplizieren springer thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 10 Haskell:ZurückzurMathematik x = x +1 n n InHaskell istdies einerekursive Definitionvonx. InderMathematikistdieseinenichtlösbareGleichung.Die Variablex istfestaneinenWertgebunden;x istnichtveränderbar (engl.immutable). InimperativenSprachenistdieseineAnweisung umdenZustand (BereichimSpeicher)dermitderVariablex assoziiertist– eine ZahlindiesemFall,dieirgendetwasrepräsentiert,z.B.dasAlter einerPerson– zuverändern. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 11 Wiederholung:Funktion f X n Y InderMathematikisteineFunktion f eineAbbildung,dieein Elementx einerMengeX eindeutig (abernichtnotwendiger Weiseeineindeutig)aufeinElementy einerZielmengeY abbildet. f : X →Y n n n Linkstotal,d.h.füralleElementevonX definiert(fallsnicht,dann nenntmanf einepartielleFunktion). Rechtseindeutig,d.h.fürjedesElementx ∊ X gibteshöchstensein Elementiny ∊ Y aufdasx abgebildetwird. X alsauchY könnenProduktmengen sein: X = X1 × ... × Xn, Y = Y1 × ... × Ym (n ≥ 0, m ≥ 1) wobeiXi,Yj wiederumMengensind,× daskartesischeProduktundn dieStelligkeit (engl.arity)vonf angibt(z.B.liefertX = A × B × C eine dreistelligeFunktion,wobeidieArgumenteElementeausA,B,C sind). thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 12 Merke n n Egalwannundegalwof ausgewertet(oderangewendet) wird,dasErgebnis y ∊ Y istnurdurchdenParameter x ∊ X bestimmt(anhandderAbbildungsvorschriftdiedurchf vorgegebenist)undsonstnichts! Ist f eineFunktionimmathematischenSinn,dannerzeugtsie keineSeiteneffekte.Dereinzige„Effekt“derAuswertungvon f istdieBerechnungdesErgebnisy ∊ Y. n MitanderenWorten: n n DerDatenfluss – d.h.dieBenutzungvonErgebnissendurchnachgeordnete Funktionen– istexplizit;esgibtkeineimplizitenEffekte. Esgibtkeinen„versteckten“(impliziten)Zustand derdasErgebniseiner Funktionbeeinflusst.DemzufolgekannauchkeinZustanddurcheinen Funktionsaufrufverändertwerden. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 13 https://xkcd.com/1312 thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 14 ReferentielleTransparenz engl.referential transparency/opaqueness n n n Iste einAusdruckimmath.funktionalenSinn(z.B.g(f(x),y)), danniste eindeutigdurchdieArgumente(unddie Auswertungssemantikdiefüre definiertist)bestimmt;d.h.... ...gegebendieArgumente,dannkannmane durchsein Ergebnisbzw.einenäquivalenten(„leichteren“)Ausdrucke' ersetzen(substituieren) DieseEigenschaft bezeichnetmanalsreferentielleTransparenz à Formalermathematisch/logischerBeweisderKorrektheiteines Programms(liefertesdaswasessoll)wirddadurchvereinfacht bzw.überhaupterstmöglich,dakeineSeiteneffektemit einbezogenwerdenmüssen. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 15 Momentmal,wiekannmandann... n ...folgendeDinge*inHaskell (bzw.reinfunktionalen Programmiersprachen)realisieren: n random() – erzeugteineZufallszahl keineFunktionenimmath.Sinn n getInput() – lieferteinüberdieTastatureingegebenesZeichen n currentTime() – liefertdieaktuelleUhrzeit/dasaktuelleDatum n queryGoogleFor(x) – liefertSuchergebnissefürStichwortx *AndieserStelleseiabsichtlichnichtderBegriffFunktion(bzw.Funktionalität)verwendet. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 16 Momentmal,wiekannmandann... n Haskell bedientsichhierfürderMonoide, Morphismen undFunktoren, welcheKonzepteausderKategorientheoriederMathematiksind: n Action – monadische Funktion(„unreine“FunktionmitSeiteneffekten) n Arrow – Verkettung/KompositionvonActions n Monad – StrukturausActions;bestimmtwieAktionenausgeführtwerden. Quelle: wiki.haskell.org thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 17 FunktionhöhererOrdnung n ...isteineFunktionbeidereinodermehrereArgument(e)und/oder dasErgebniswiederumeineFunktionsind. n n n (X → Y ) → Z Funktionen,genausowieArgumente,sind„first-classcitizens“ HauptanwendungliegtinderAbstraktionvonmehrerenFunktionen aneinemOrt. Beispiele(informell): n n n EineFunktiondieeineListevonZahlenunddieQuadrat-Funktionals Argumentehat,dieaufjedeZahldieQuadrat-Funktionanwendetunddie soentstandeneListederQuadratzahlenzurückgibt. EineFunktiondieeineListevonZahlenunddieMaximum-Funktionals Argumentehat,diesukzessivdieMaximum-FunktionaufjezweiZahlen anwendetumdadurchdengrösstenWertderListezufinden. EineFunktion,die,gegebeneinedifferenzierbareFunktionf,derenerste Ableitungf ' alsErgebnisliefert(analytischoderdurchnumerischeApprox.). thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 18 Bedarfsauswertung engl.lazy evaluation,call-by-need n ReferentielleTransparenzermöglichtBedarfsauswertung... n n n n ...daeskeineRollespieltobdasErgebniseinerFunktionbeijedemAufruf immer(inaufwändigerWeise)berechnetwird,odererstdann,wenndas Ergebniswirklichgebraucht/verwendetwird,d.h.... ...einAusdruckwirddannausgewertetwenndaraufzugegriffenwird. Definition (StrikteFunktion):Seif eineFunktionunde ein nichtterminierenderAusdruck.f iststrikt gdw.f(e) nichtterminiert. Haskel istnichtstrikt.WasnichtbenötigtwirdfüreineBerechnung, wirdniemalsausgewertetwerden.DemzufolgesindAusdrückederen Auswertungunendlichlanglaufenwürde,oderdienichtvollständig berechenbarsind(daz.B.fehlerhaft),dieabernicht(komplett) ausgewertetwerdenmüssen,keinProblem. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 19 Bedarfsauswertung n ErmöglichtesunendlicheStrukturenzudeklarierenunddamitzu arbeiten;z.B.: n ListeallerpositivenGanzzahlen: [1..] n n UnendlicheListevonEinsen: ListeallerQuadratzahlen: Beispiel: n (ii) head head head head head head ones = 1 : ones squares = map (^2) [1..] :: [Int] -> Int -- Funktion welche aus einer [] = undefined -- Liste von Integer Zahlen (x:xs) = x -- die erste Zahl zurück gibt. [1..] -- terminiert und liefert “1” ones -dito squares -dito Nachteil:esistu.U.schwierigervorhersagbar,wannbzw.obeine Ressourcetatsächlichbenutztwird(z.B.Netzwerkzugrifferfolgt). thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 20 WeiterewesentlicheEigenschaften n InHaskell (undanderen„rein“funktionalenSprachen) existierenkeineKontrollstrukturenwiez.B.Schleifen n n n n StattdessenwirdRekursionbenutzt StrengesTypsystem:AlleTypenstatischzurCompilezeit bekannt, wodurchTypinkompatibilitätenerkennbarsind. PolymorphesTypsystem:FunktionenkönnenfüreineKlasse verschiedenerTypenanwendbarsein. AutomatischeSpeicherverwaltung:keineZeigermanipulation; keinAnfordernundFreigebenvonSpeicher. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 21 Haskell:Kostproben DasobligatorischeHello World: Dateinamenskonvention hello.hs module Main where main :: IO() main = putStrLn "Hello, World" f :: Ord a => [a] -> [a] f [] = [] f (x:xs) = f ys ++ [x] ++ f zs where ys = [a | a <- xs, a <= x] zs = [b | b <- xs, b > x] ? f :: Ord a => [a] -> [a] f [] = [] f (x:xs) = f [a | a<-xs, a<=x] ++ [x] ++ f [b | b<-xs, b>x] thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 22 SchlüsselwörterinHaskell SchlüsselwörterinHaskell as case of class data default deriving deriving instance do data family forall foreign hiding import data instance if then else instance let in infix infixl infixr mdo module newtype proc qualified rec type type family type instance where NurinbestimmtenKontextreserviert.KannandernortsalsFunktions- bzw. Variablen-Namebenutztwerden. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 K08 Haskell 1. GrundlegendeEigenschaften 2. GHCi undGHC 3. Typsystem thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 24 GHCi – Interaktiver HaskellInterpreter n n GlasgowHaskell Compiler (GHC)kannalsdieReferenzimplementierung vonHaskell betrachtetwerden.Wirdaucham häufigstenbenutzt. GHCi isteininteraktiverInterpreterzumTesten(Scrapbook) n Startendurchghci thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 25 GHCi – einfacheAusdrückeauswerten n > istderEingabeprompt;zeigtan,dassGHCi bereitzum AuswertenvonAusdrückenist. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 26 Prelude– dieStandardbibliothek n Prelude.hs isteineBibliothek(genauergesagteinmodule) welcheperDefaultzurVerfügungsteht. n Bietetzahlreiche,grundlegendeFunktionenundDatentypenan > compare 2 3 LT -- Relation zweier Elemente aus Menge -- mit definierter Ordnung (LT, GT, EQ) > head [1,2,3,4,5] 1 -- erstes Element einer Liste -- analog liefert tail die Restliste > [1,2,3,4,5] !! 2 3 -- n-tes Element einer Liste > take 3 [1,2,3,4,5] [1,2,3] -- ersten n Elemente einer Liste thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 27 Prelude – weitereBeispiele > drop 3 [1,2,3,4,5] [4,5] -- Restliste ohne die ersten n Elemente > length [1,2,3,4,5] 5 -- Länge der Liste (Anzahl Elemente) > product [1,2,3,4,5] -- Produkt aller Listenelemente 120 > [1,2,3] ++ [4,5] [1,2,3,4,5] -- Konkatenation zweier Listen > reverse [1,2,3,4,5] -- umgekehrt geordnete Liste [5,4,3,2,1] > even 11 False > max 33 2 33 -- ist die gegebene Zahl gerade -- grössere der beiden Zahlen thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 28 Überblickgewinnen n n Wiefindetmanschnellöffentliche/freieBibliothekenunddie darinangebotenenFunktionen undDatentypen? Hoogle is your friend ...http://www.haskell.org/hoogle/ n n n n ZentralisiertesArchivmitSuchfunktion, indemalleregistriertenAPIs dokumentiertsind Suchenach: n Funktionsname,z.B.map n Signatur,z.B.(a->b)->[a]->[b] Eclipse-IntegrationüberEclipseFP AuchmitEMACSintegrierbar thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 29 SyntaxFunktionsanwendung n InderMathematik: f(a, b) + cd WendedieFunktionf aufdie Argumentea undb anund addieredasErgebniszum Produktvonc undd. f isthiereinFunktionsname;a, b, c, d sindVariablennamen n InHaskell: f a b + c * d Argumentevonf folgenohne Klammern;alleOperationen durcheinSymbolrepräsentiert à * fürdieMultiplikation. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 30 Funktionsanwendung- Beispiele n Gegenüberstellung: Mathematik Haskell f(x) f x f(x, y) f x y f(g(x)) f (g x) f(x, g(y)) f x (g y) f(x) g(y) f x * g y RundeKlammern: ordnenArgument(e) einerFunktionzu bildenAusdrückeunddamit eineVorrangordnungbei Verschachtelung thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 31 Funktionen- undOperatorrangfolge n FunktionenhabenhöherePräzedenz alsOperatoren f a + b n Esgibt9PräzedenzstufenfürOperatoren n n -- bedeutet f(a) + b anstatt f(a + b) RelativePräzedenzmathematischerOperatorenentsprechendden mathematischenRegeln(z.B.hat* hathöherePräzedenzals+) FunktionsanwendunghatStufe10 thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 32 Skript/ProgramminGHCi laden myFirstScript.hs n double x = x + x quadruple x = double (double x) Reihenfolgeegal; Definitionirgendwo, abernichtnotwendigerweise zuvor SkriptmitGHCi laden: > ghci myFirstScript.hs Prelude> :l myFirstScript.hs n Prelude.hs undmyFirstScript.hs sinddanngeladenunddiedarin definiertenFunktionenkönnenaufgerufenwerden. Prelude> quadruple 10 40 Prelude> take (double 2) [1,2,3,4,5,6] [1,2,3,4] thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 33 Skript/Programmneuladen n WennSkriptextern(ineinemEditor)geändertwurde,muss esmit:reload (bzw.:r)erneutgeladenwerdenumdie Änderungenzuaktivieren. Prelude> :r Ok, modules loaded: Main. Prelude> factorial 10 3628800 Prelude> average [1,2,3,4,5] 3 thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 34 HäufiggebrauchteGHCi-Kommandos Kommando :loadname Kurzform :lname Bedeutung ladeSkriptname :reload :r aktuellesSkriptneuladen :editname :ename editiereSkriptname :edit :info :e :i editiereaktuellesSkript InformationzuTyp/Funktion :typeexpr :help :texpr :? zeigeTypvonexpr zeigealleKommandos :quit :q beendeghci thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 35 GHCCompiler hello.hs module Main where main :: IO() main = putStrLn "Hello, World" Programmkompilieren: > ghc –o hello hello.hs > ./hello > Hello, World n AnalogzuvielenanderenSprachenistdiemain Funktion(optional imModulMain) – welchegleichzeitigeinesog.Aktion ist;dazu spätermehr– derEinstiegspunktineinHaskell-Programm. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 36 EinrückungalsStrukturierungselement (i) n n InHaskell (ähnlichwiez.B.inPython)kanndieEinrückungimQuelltext eineRollespielen:BlöckekönnendurchEinrückunggebildetwerden,d.h. Whitespace (LeerzeichenundTabulatoren)hateineabgrenzende Semantik. WennBlockbildungdurchEinrückung,dannmüssenineinerSequenzvon Zeilen(z.B.Definitionen)alleinexaktderselbenSpaltebeginnen: a = 10 b = 20 c = 30 a = 10 b = 20 c = 30 a = 10 b = 20 c = 30 thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf xs = 10 x = 20 c = 30 28.April2017 37 EinrückungalsStrukturierungselement (ii) n BlockbildungdurchEinrückungvermeidetdieNotwendigkeit spezielleSymbolezurBlockbegrenzungbenutzenzumüssen. a = b + c where b = 1 c = 2 d = a * 2 implizite Gruppierung bedeutet a = b + c where {b = 1; c = 2} d = a * 2 explizite Gruppierung thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 K08 Haskell 1. GrundlegendeEigenschaften 2. GHCi undGHC 3. Typsystem thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 39 Typen(Wiederholung) n EinTypisteinBezeichner füreineMenge vongleichartigen Elementenbzw.Werten(engl.values). n n n EineKlasseistz.B.eineüblicherweisenichtleereMengevonObjekten (Instanzen)diesichderKlassezuordnenlassen. AufeinemTypisteineMengevonOperationenundFunktionen definiert. InHaskell existiertz.B.derTyp Bool welchergenauzweiWerteenthält: False thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf True 28.April2017 40 TypfehlerinHaskell n DieAnwendungeinerFunktionaufinkompatibleArgumente isteinTypfehler (engl.typeerror). > 1 + False Error 1 ist eine Zahl andFalse ein Bool; jedoch erwartet + zwei Zahlen. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 41 TypeninHaskell n WenndieAuswertungeinesAusdruckse einenWert (Ergebnis)vomTypt liefert,danniste vomTypt e :: t n JedersyntaktischkorrekteAusdruckhatinHaskell demzufolgeeinenTyp,welchersichautomatisch zur Compilezeit ableitenlässt.DiesenProzessnenntman Typinferenz(engl.typeinference). n Haskell hateinstatischesundstrengesTypsystem n EskönnenkeineTypfehlerzurLaufzeitauftreten n GeringereFehleranfälligkeitundbessereLaufzeitperformance (dakeineCheckszurLaufzeitnotwendigsind) thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 42 TypeinesAusdrucksabfragen n DerTypeinesAusdruckse kanninGHCi mitdemKommando :type (bzw.:t alsKurzform) abgefragtwerden,ohnedasse dabeiausgewertetwird. > :t "foo" "foo" :: [Char] > :t not False not False :: Bool > :t 3 + 2 3 + 2 :: Num a => a thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 43 AllgemeineDatentypeninHaskell Typ Breite/Präzision Bool Int Integer Float2 Double fest(32,64bit)1 theoretischunbeschränkt einfach(32bit) doppelt(64bit) Char String EinzelnesZeichen Zeichenkette(ListevonZeichen) Rational3 QuotientzweierInteger-Werte Wertebereich True,False mindestens−229 bis 229−1 -∞ bis+∞ ≈1.175×10-38 bis≈3.4×1038 ≈4.9406564584124654×10−32 4 bis ≈1.7976931348623157×10308 UNICODE Complex 1 Maschinenabhängig 2 Laut„RealWorldHaskell“Verwendungnichtempfohlen„...is much slower ...“ 3 Ratio Bibliothek thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 44 Listentypen n EineListe isteineFolgevonWertendesselben Typs: [False,True,False] :: [Bool] [’a’,’b’,’c’,’d’] n n :: [Char] Generellgilt: [t] istderTypvonListenderenElementevomTypt sind ElementekönnenwiederumListendesselbenTypssein: [[’a’],[’b’,’c’]] :: [[Char]] n TypistunabhängigvonderLängederListe n Spezialfall:leereListe thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf > :t [] [] :: [a] 28.April2017 45 Typeltypen n EinTupel isteineFolgevonElementenderenjeweiligerTyp unterschiedlich seinkann: (False,True) (False,'a',True) ("foo",1,2) ('a',('b','c')) :: :: :: :: (Bool,Bool) (Bool,Char,Bool) (Num t1, Num t) => ([Char],t,t1) (Char,(Char,Char)) n Generellgilt: (t1,t2,…,tn) istderTypvonn-Tupeln deren i-tes ElementvomTypti ist(1 ≤ i ≤ n) AusdemTypkannmanalsodieLängedesTupels ableiten. n Spezialfall:leeresTupel n > :t () () :: () thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 46 Funktionstypen n EineFunktion isteineAbbildungvonWerteneinesTypsauf WerteeinesTyps. not :: Bool -> Bool isDigit :: Char -> Bool n Generellgilt: t1 ->t2 istderTypderKlassevonFunktionen, dieWertevomTypt1 aufWertevomTypt2 abbilden. n :: (Int,Int) -> Int ArgumentundErgebnistyp add add (x,y) = x+y sindnichtbeschränkt: zeroToN zeroToN n :: Int -> [Int] = [0..n] thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 47 Terminologie Typsignatur Funktionsduplizieren :: Bild -> Bild name duplizieren x = neben (spiegeln x) (graustufen x) aktuellerParameter formalerParameter duplizieren springer Ausdruck(Expression) Funktionsrumpf duplizieren :: Bild -> Bild duplizieren x = neben (spiegeln x) (graustufen x) Funktionsdefinition thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 48 Curryfizierte Funktionen n n (i) FunktionenmitmehrerenArgumentengibteseigentlichgarnichtin Haskell:AlleFunktionenhabengenaueinArgument(odergarkeinesfalls siekonstantsind). EineFunktionmitmehrerenArgumentenlässtsichalsFunktion darstellen,dieeinArgumenthatundeineFunktionalsErgebnisliefert. f : (A1 ⇥ · · · ⇥ An ) ! B f 0 : A1 ! (A2 ! (. . . (An ! B) . . . )) add' :: Int -> Int -> Int add' x y = x+y add' hateineInt-ZahlalsArgument (x)undlieferteineFunktion vomTypInt -> Int.DieseFunktionwiederumhateineIntZahl(y)alsArgumentundlieferteineInt-ZahlalsErgebnisx+y. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 49 Curryfizierte Funktionen (ii) add' :: Int -> Int -> Int add :: (Int, Int) -> Int n n n add undadd' produzierendasselbeEndergebnis,jedochnimmtadd beideArgumentezurselbenZeit(übereinTupel),währenddessenadd' jeweilsnureinArgumentverarbeitet. FunktionendiejeweilsnureinArgumentverarbeitenbezeichnetmanals Currifiziert (ProzessseltenauchSchönfinkeln genannt). HauptvorteiltheoretischerArt:formaleBeweisederKorrektheitvon Programmenwirdvereinfacht,wennalleFunktiongleichförmigsind. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 50 Curryfizierte Funktionen n (iii) Beachte: n AbbildungspfeilinFunktionssignaturrechtsassoziativ: Int -> Int -> Int -> Int Int -> (Int -> (Int -> Int)) n Funktionsapplikationlinksassoziativ: foo x y z ((foo x) y) z thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 51 PartielleFunktionsanwendung n Curryfizierung ermöglichtpartielleFunktionsanwendung: > :t zip3 -- Funktion die Dreiertupel aus drei Listen bildet zip3 :: [a] -> [b] -> [c] -> [(a, b, c)] > zip3 "foo" "bar" "quux" [('f','b','q'),('o','a','u'),('o','r','u')] > let zip3foo = zip3 "foo" > :type zip3foo zip3foo :: [b] -> [c] -> [(Char, b, c)] > zip3foo "aaa" "bbb" [('f','a','b'),('o','a','b'),('o','a','b')] > zip3foo [1,2,3] [True,False,True] [('f',1,True),('o',2,False),('o',3,True)] thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 52 PolymorpheFunktionen n (i) EineFunktionistpolymorph wennihrTypmindestenseine Typvariable enthält. length :: [a] -> Int Für beliebige Typen a liefert length einen Integerals Ergebnis,gegeben eine Liste mit Elementen vom Typ a. Beispiel: > length [False,True] -- a = Bool 2 > length [1,2,3,4] 4 -- a = Int thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 53 BeispielepolymorpherFunktionen n ZahlreicheFunktionenausPrelude.hs (undanderen Bibliotheken)sindpolymorph,z.B.: fst :: (a,b) -> a head :: [a] -> a take :: Int -> [a] -> [a] zip :: [a] -> [b] -> [(a,b)] id :: a -> a compare :: Ord a => a -> a -> Ordering thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 54 ÜberladeneFunktionen n EinepolymorpheFunktionistüberladenwennihrTyp mindestenseineTypnebenbedingung(engl.typeconstraint) enthält. Beispiel: sum :: Num a => [a] -> a FürbeliebigeTypena die vonNum abgeleitetsind liefertsum einErgebnis vomTypa gegebeneine ListevomTypa. > sum [1,2,3] 6 -- Int > sum [1.1,2.2,3.3] 6.6 -- Float > sum ['a','b','c'] ERROR -- Char -- kein Num Num isteineTypklasse diealsOberklassefürnumerischeDatentypenvorgesehenist. thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 55 Typklassen n TypklasseninHaskell sindvergleichbarmitInterfacesinJava. Num NumerischeTypen Eq TypenfürderenElementeGleichheitdefiniertist. Ord TypenaufderenElementeneineOrdnung definiertist. Beispiele: (+) :: Num a => a -> a -> a (==) :: Eq a (<) => a -> a -> Bool :: Ord a => a -> a -> Bool thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 56 Namensregeln n Haskell unterscheidetzwischenGross- undKleinschreibung name naMe Name unterschiedlicheNamen/Bezeichner n TypenundKonstruktoren beginnenmiteinemGrossbuchstabe n Variablen undFunktionenbeginnenmiteinemKleinbuchstabe n n ZusätzlichdarfauchderUnterstrich_undweitereSonderzeichenfür Funktionenverwendetwerden: arg_2 myFun fun1 _myFun NeuereVersionenunterstützenauchUNICODE-Zeichen: пять два x’ умножить thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 57 Operatoren n n SindauchFunktionen: binärerOperator a b istzweistelligeFunktion Standardmässigvorhandenebinäre/unäre Operatoren n n n (a, b) ArithmetischeOperatoren: +,*,^,-,div,mod,abs,negate Vergleichsoperatoren: beachte:nicht!= wieinC/C++/Java >,>=,==,/=,<=,< FürdieDefinitionneuerOperatorengeltenimPrinzipdieselben NamensregelnwiefürFunktionen n n VerwendbareZeichen: ! # $ % & * + . / < = > ? @ \ : - | ~ ^ ReservierteNamen(Bezeichner): _ .. : :: = \ | <- -> @ ~ => thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 58 Fixity: Assoziativität undPräzedenz n DieKombinationausAssoziativität undPräzedenzvonOperatoren wirdauchalsFixity bezeichnet: n infixl – Infixoperator,linksassoziativ,z.B.: a+b+c+d n ((a+b)+c)+d infixr – Infixoperator,rechtsassoziativ,z.B.: (f.g.h) a n à à f (g (h a)) infix – Infixoperator,nichtassoziativ,z.B.: a<b<c à weder(a<b)<c nocha<(b<c) gilt n Deklaration: infixr 5 ++ -- rechtsassoz.; Präzedenz 5 infixl 9 . -- linksassoz.; Präzedenz 9 thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 59 Fixity - Beispiele thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017 60 Beispiel:Operatordefinieren n Operator+++und***definieren: infixl infixl 6 +++ 7 *** infixl infixl myOp.hs 7 +++ 6 *** (+++) :: Int -> Int -> Int a +++ b = a + 2*b (***) :: Int -> Int -> Int a *** b = a - 4*b n Anwendung(GHCi): Prelude> l: myOp.hs Prelude> 1 +++ 2 *** 3 -19 (1 + 2*(2 – 4*3)) ((1 + 2*2) – 4*3) thorstenmöller- informatik.unibas.ch/lehre/fs17/prog/08-haskell.pdf 28.April2017