K07 Haskell 1. Grundlegende Eigenschaften 2. GHCi undGHC 3. Typsystem teilweisebasiertaufFolienvonGrahamHutton undPhilipWadler thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 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/fs16/prog/07-haskell.pdf 28.April2016 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/fs16/prog/07-haskell.pdf 28.April2016 4 IstFPrelevant? n VieleKonzeptederFPfindenEinganginden„Alltag“der Softwareentwicklung bzw.indieWeiterentwicklung konventioneller Sprachen: xmonad PUGSPERL6 Compiler Projekte,dieinHaskellgeschrieben sind (Auswahl) GoogleMapReduce Übersicht:http://www.haskell.org/haskellwiki/Haskell_in_industry thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 5 WarumgeradeHaskell undnicht... ...Erlang,F#,Lisp,ML,O‘Caml,Scheme, Scala,... n n ReinfunktionaleSprache– „purely functional“ UnterdenfunktionalenProgrammiersprachensehrpopulär n n n n Grosse MengeanBibliotheken NichtnurGegenstandderForschung,sondernindustrielleingesetzt (mansollteesnichtalseine„akademischeSpielwiese“auffassen) CompileralsauchinteraktiveInterpreterverfügbar(z.B. GlasgowHaskell Compiler ghc undghci) n GutebissehrguteLaufzeitperformance wennkompiliert n ToolsfürEntwickler(IDEs,Debugger, Build,Profiler) EntworfendurcheinKomitee thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 6 WasistFunktionaleProgrammierung? Allgemein zusammengefasst: n Programmierstil(Paradigma)dessengrundlegende Methodedie Anwendung vonFunktionen aufderenArgumente ist: EinProgrammistformuliertalseine(möglicherweise ausvielen Unterfunktionenzusammengesetzte) Funktion(immath.Sinn), dessenAusführungderAuswertungdieser Funktionentspricht. n EinefunktionaleProgrammiersprache unterstützt /fördert /erzwingt diesenProgrammierstil. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 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, diedieSummeeiner Listevon Zahlenberechnet. :: Num [] [x] (x:xs) a = = = => [a] -> a 0 x x + sum [xs] thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 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/fs16/prog/07-haskell.pdf 28.April2016 9 NeueFunktionausbestehendenFunktionendefinieren graustufen neben spiegeln duplizieren duplizieren :: Bild -> Bild duplizieren x = neben (spiegeln x) (graustufen x) duplizieren springer thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 10 Haskell:ZurückzurMathematik x = x +1 n n InHaskell istdies einerekursive Definitionvonx. InderMathematikistdieseinenichtlösbareGleichung.Die Variablex istfestaneinenWertgebunden;x istnichtveränderbar (engl.immutable). Inimperativen SprachenistdieseineAnweisung umdenZustand (BereichimSpeicher)dermitderVariablex assoziiertist– eine Zahlindiesem Fall,dieirgendetwasrepräsentiert,z.B.dasAlter einerPerson– zuverändern. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 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,× daskartesische Produktundn dieStelligkeit (engl.arity)vonf angibt(z.B. liefert X = A × B × C eine dreistelligeFunktion,wobeidieArgumenteElementeausA,B,C sind). thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 12 Merke n n Egalwannundegalwof ausgewertet(oderangewendet) wird,dasErgebnis y ∊ Y istnurdurchdenParameter x ∊ X bestimmt(anhandderAbbildungsvorschriftdiedurchf vorgegebenist)undsonstnichts! Ist f eineFunktionimmathematischen Sinn,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/fs16/prog/07-haskell.pdf 28.April2016 13 ReferentielleTransparenz engl.referential transparency/opaqueness n n n Iste einAusdruckimmath.funktionalenSinn(z.B.g(f(x),y)), danniste eindeutigdurchdieArgumente(unddie Auswertungssemantik diefüre definiertist)bestimmt;d.h.... ...gegebendieArgumente,dannkannmane durchsein Ergebnisbzw.einenäquivalenten(„leichteren“)Ausdrucke' ersetzen(substituieren) DieseEigenschaft bezeichnetmanalsreferentielleTransparenz à Formalermathematisch/logischer BeweisderKorrektheiteines Programms (liefertesdaswasessoll)wirddadurchvereinfacht bzw.überhaupterstmöglich,dakeineSeiteneffektemit einbezogenwerdenmüssen. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 14 Momentmal,wiekannmandann... n ...folgendeDinge*inHaskell (bzw.reinfunktionalen Programmiersprachen)realisieren: n random() – erzeugteineZufallszahl keineFunktionenimmath.Sinn n getInput() – liefert einüberdieTastatur eingegebenes Zeichen n currentTime() – liefert dieaktuelleUhrzeit/das aktuelleDatum n queryGoogleFor(x) – liefert Suchergebnisse fürStichwortx *AndieserStelleseiabsichtlichnichtderBegriffFunktion(bzw.Funktionalität)verwendet. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 15 Momentmal,wiekannmandann... n Haskell bedientsichhierfürderMonoide, Morphismen undFunktoren, welcheKonzepteausderKategorientheorie derMathematiksind: n Action – monadische Funktion(„unreine“FunktionmitSeiteneffekten) n Arrow – Verkettung/Komposition vonActions n Monad – StrukturausActions;bestimmtwieAktionenausgeführtwerden. Quelle: wiki.haskell.org thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 16 FunktionhöhererOrdnung n ...isteineFunktionbeidereinodermehrereArgument(e)und/oder dasErgebniswiederum eineFunktionsind. n n n (X → Y ) → Z Funktionen,genausowieArgumente,sind„first-classcitizens“ HauptanwendungliegtinderAbstraktionvonmehrerenFunktionen aneinem Ort. 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/fs16/prog/07-haskell.pdf 28.April2016 17 Bedarfsauswertung engl.lazy evaluation,call-by-need n Referentielle Transparenzermö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/fs16/prog/07-haskell.pdf 28.April2016 18 Bedarfsauswertung n ErmöglichtesunendlicheStrukturenzudeklarieren unddamitzu arbeiten;z.B.: n ListeallerpositivenGanzzahlen: [1..] n n Unendliche ListevonEinsen: 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.schwieriger vorhersagbar, wannbzw.obeine Ressource tatsächlichbenutztwird(z.B.Netzwerkzugriff erfolgt). thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 19 WeiterewesentlicheEigenschaften n InHaskell (undanderen„rein“funktionalen Sprachen) 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/fs16/prog/07-haskell.pdf 28.April2016 20 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/fs16/prog/07-haskell.pdf 28.April2016 21 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 Nurinbestimmten Kontextreserviert.KannandernortsalsFunktions- bzw. Variablen-Namebenutztwerden. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 K07 Haskell 1. Grundlegende Eigenschaften 2. GHCi undGHC 3. Typsystem thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 23 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/fs16/prog/07-haskell.pdf 28.April2016 24 GHCi – einfacheAusdrückeauswerten n > istderEingabeprompt;zeigtan,dassGHCi bereitzum AuswertenvonAusdrückenist. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 25 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/fs16/prog/07-haskell.pdf 28.April2016 26 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/fs16/prog/07-haskell.pdf 28.April2016 27 Überblickgewinnen n n Wiefindetmanschnellöffentliche/freieBibliothekenunddie darinangebotenen Funktionen undDatentypen? Hoogle is your friend ...http://www.haskell.org/hoogle/ n n Zentralisiertes ArchivmitSuchfunktion, indemalleregistrierten APIs dokumentiertsind Suchenach: n Funktionsname,z.B.map n Signatur,z.B. (a->b)->[a]->[b] n Eclipse-IntegrationüberEclipseFP n AuchmitEMACSintegrierbar thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 28 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/fs16/prog/07-haskell.pdf 28.April2016 29 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ücke unddamit eineVorrangordnungbei Verschachtelung thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 30 Funktionen- undOperatorrangfolge n Funktionen habenhöherePräzedenz alsOperatoren f a + b n Esgibt9Präzedenzstufen fürOperatoren n n -- bedeutet f(a) + b anstatt f(a + b) RelativePräzedenzmathematischerOperatorenentsprechendden mathematischenRegeln(z.B.hat* hathöherePräzedenzals+) Funktionsanwendung hatStufe10 thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 31 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 definierten Funktionenkönnenaufgerufen werden. Prelude> quadruple 10 40 Prelude> take (double 2) [1,2,3,4,5,6] [1,2,3,4] thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 32 Skript/Programmneuladen n WennSkriptextern(ineinemEditor)geändertwurde,muss esmit:reload (bzw.:r)erneutgeladenwerdenumdie Änderungen zuaktivieren. Prelude> :r Ok, modules loaded: Main. Prelude> factorial 10 3628800 Prelude> average [1,2,3,4,5] 3 thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 33 HäufiggebrauchteGHCi-Kommandos Kommando Kurzform Bedeutung :loadname :reload :lname :r ladeSkriptname aktuellesSkriptneuladen :editname :ename editiereSkriptname :edit :e editiereaktuellesSkript :info :typeexpr :i :texpr InformationzuTyp/Funktion zeigeTypvonexpr :help :? zeigealleKommandos :quit :q beende ghci thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 34 GHCCompiler hello.hs module Main where main :: IO() main = putStrLn "Hello, World" Programmkompilieren: > ghc –o hello hello.hs > ./hello > Hello, World n Analogzuvielen anderenSprachenistdiemain Funktion(optional imModulMain) – welche gleichzeitigeinesog.Aktion ist;dazu spätermehr– derEinstiegspunkt ineinHaskell-Programm. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 35 EinrückungalsStrukturierungselement (i) n n InHaskell (ähnlichwiez.B.inPython)kanndieEinrückungimQuelltext eineRollespielen:BlöckekönnendurchEinrückunggebildetwerden,d.h. Whitespace (Leerzeichen undTabulatoren)hateineabgrenzende Semantik. WennBlockbildungdurchEinrückung,dannmüssenineinerSequenzvon Zeilen(z.B. Definitionen) alleinexaktderselben Spaltebeginnen: a = 10 b = 20 c = 30 a = 10 b = 20 c = 30 a = 10 b = 20 c = 30 thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf xs = 10 x = 20 c = 30 28.April2016 36 EinrückungalsStrukturierungselement (ii) n BlockbildungdurchEinrückungvermeidetdieNotwendigkeit spezielleSymbolezurBlockbegrenzungbenutzen zumü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/fs16/prog/07-haskell.pdf 28.April2016 K07 Haskell 1. Grundlegende Eigenschaften 2. GHCi undGHC 3. Typsystem thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 38 Typen(Wiederholung) n EinTypisteinBezeichner füreineMenge vongleichartigen Elementen bzw.Werten(engl.values). n n n EineKlasseistz.B.eineüblicherweise nichtleere MengevonObjekten (Instanzen) diesichderKlassezuordnenlassen. AufeinemTypisteineMengevonOperationenundFunktionen definiert. InHaskell existiertz.B.derTyp Bool welchergenauzweiWerteenthält: False thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf True 28.April2016 39 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/fs16/prog/07-haskell.pdf 28.April2016 40 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önnenkeineTypfehler zurLaufzeitauftreten n Geringere Fehleranfälligkeitundbessere Laufzeitperformance (dakeineCheckszurLaufzeitnotwendigsind) thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 41 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/fs16/prog/07-haskell.pdf 28.April2016 42 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/fs16/prog/07-haskell.pdf 28.April2016 43 Listentypen n EineListe isteineFolgevonWertendesselben Typs: [False,True,False] :: [Bool] [’a’,’b’,’c’,’d’] :: [Char] n n Generellgilt: [t] istderTypvonListenderenElemente vomTypt sind Elemente könnenwiederum Listendesselben Typssein: [[’a’],[’b’,’c’]] :: [[Char]] n TypistunabhängigvonderLängederListe n Spezialfall:leereListe thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf > :t [] [] :: [a] 28.April2016 44 Typeltypen n EinTupel isteineFolgevonElementenderenjeweiligerTyp unterschiedlich seinkann: (False,True) (False,'a',True) ("foo",1,2) ('a',('b','c')) n :: :: :: :: (Bool,Bool) (Bool,Char,Bool) (Num t1, Num t) => ([Char],t,t1) (Char,(Char,Char)) Generellgilt: (t1,t2,…,tn) istderTypvonn-Tupeln deren i-tes ElementvomTypti ist(1 ≤ i ≤ n) n AusdemTypkannmanalsodieLängedesTupels ableiten. n Spezialfall:leeresTupel > :t () () :: () thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 45 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/fs16/prog/07-haskell.pdf 28.April2016 46 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/fs16/prog/07-haskell.pdf 28.April2016 47 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)undliefert eineFunktion vomTypInt -> Int.DieseFunktionwiederumhateineIntZahl(y)alsArgumentundliefert eineInt-ZahlalsErgebnisx+y. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 48 Curryfizierte Funktionen (ii) add' :: Int -> Int -> Int add :: (Int, Int) -> Int n n n add undadd' produzierendasselbe Endergebnis, jedochnimmtadd beideArgumentezurselbenZeit(über einTupel),währenddessen add' jeweilsnureinArgumentverarbeitet. FunktionendiejeweilsnureinArgumentverarbeiten bezeichnet manals Currifiziert (ProzessseltenauchSchönfinkeln genannt). Hauptvorteiltheoretischer Art:formaleBeweise derKorrektheitvon Programmenwirdvereinfacht, wennalleFunktiongleichförmigsind. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 49 Curryfizierte Funktionen n (iii) Beachte: n Abbildungspfeil inFunktionssignaturrechtsassoziativ: Int -> Int -> Int -> Int Int -> (Int -> (Int -> Int)) n Funktionsapplikationlinksassoziativ: foo x y z ((foo x) y) z thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 50 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/fs16/prog/07-haskell.pdf 28.April2016 51 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/fs16/prog/07-haskell.pdf 28.April2016 52 BeispielepolymorpherFunktionen n ZahlreicheFunktionen ausPrelude.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/fs16/prog/07-haskell.pdf 28.April2016 53 ÜberladeneFunktionen n EinepolymorpheFunktionistüberladenwennihrTyp mindestenseineTypnebenbedingung (engl.typeconstraint) enthält. Beispiel: sum :: Num a => [a] -> a FürbeliebigeTypena die vonNum abgeleitetsind liefert sum 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 diealsOberklasse fürnumerische Datentypenvorgesehen ist. thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 54 Typklassen n TypklasseninHaskell sindvergleichbarmitInterfacesinJava. Num NumerischeTypen Eq TypenfürderenElementeGleichheitdefiniertist. Ord TypenaufderenElementen eineOrdnung definiertist. Beispiele: (+) :: Num a => a -> a -> a (==) :: Eq a (<) => a -> a -> Bool :: Ord a => a -> a -> Bool thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 55 Namensregeln n Haskell unterscheidetzwischenGross- undKleinschreibung name naMe Name unterschiedliche Namen/Bezeichner n TypenundKonstruktoren beginnenmiteinemGrossbuchstabe n Variablen undFunktionenbeginnenmiteinemKleinbuchstabe n n ZusätzlichdarfauchderUnterstrich_undweitereSonderzeichenfür Funktionenverwendet werden: arg_2 myFun fun1 _myFun NeuereVersionen unterstützenauchUNICODE-Zeichen: пять два x’ умножить thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 56 Operatoren n n SindauchFunktionen: binärerOperator a b istzweistellige Funktion Standardmässigvorhandene binäre/unäre Operatoren n n n (a, b) ArithmetischeOperatoren: +,*,^,-,div,mod,abs,negate Vergleichsoperatoren: beachte:nicht!= wieinC/C++/Java >,>=,==,/=,<=,< FürdieDefinition neuerOperatorengeltenimPrinzipdieselben Namensregeln wiefürFunktionen n n VerwendbareZeichen: ! # $ % & * + . / < = > ? @ \ : - | ~ ^ ReservierteNamen(Bezeichner): _ .. : :: = \ | <- -> @ ~ => thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 57 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/fs16/prog/07-haskell.pdf 28.April2016 58 Fixity - Beispiele thorstenmöller - informatik.unibas.ch/lehre/fs16/prog/07-haskell.pdf 28.April2016 59 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/fs16/prog/07-haskell.pdf 28.April2016