Teil I

Werbung
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
Herunterladen