programmieren in haskell syntax und semantik von haskell fileprogrammieren in haskell syntax und...

38
Programmieren in Haskell Syntax und Semantik von Haskell Peter Steffen Universit¨ at Bielefeld Technische Fakult¨ at 13.11.2009 1 Programmieren in Haskell

Upload: dothuy

Post on 25-Aug-2019

283 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Programmieren in HaskellSyntax und Semantik von Haskell

Peter Steffen

Universitat BielefeldTechnische Fakultat

13.11.2009

1 Programmieren in Haskell

Page 2: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Was wir heute machen

Datentypdefinitionen

Wertdefinitionen, Variablenbindungen

Musterbindungen

Funktionsbindungen

Bewachte Gleichungen

Lokale Definitionen mit where und let

Gultigkeitsbereiche

Fallunterscheidungen

Syntaktischer Zucker / Kernsprache

2 Programmieren in Haskell

Page 3: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Datentypen, Datentypdefinitionen

data Instrument = Oboe| HonkyTonkPiano| Cello| VoiceAahs

data Musik = Note Ton Dauer| Pause Dauer| Musik :*: Musik| Musik :+: Musik| Instr Instrument Musik| Tempo GanzeZahl Musik

3 Programmieren in Haskell

Page 4: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Wahrheitswerte

data Bool = False | True -- vordefiniert

4 Programmieren in Haskell

Page 5: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Ganze Zahlen

data Ganz = Zero |Succ Ganz

Zero, Succ Zero, Succ (Succ Zero), . . .

Eingebaute Datentypen: Int und Integer

5 Programmieren in Haskell

Page 6: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Tupeltypen

data Pair a b = Pair a bdata Triple a b c = Triple a b c

Eingebaute Datentypen: (a,b), (a,b,c)

6 Programmieren in Haskell

Page 7: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Listen

data List a = Empty | Front a (List a)

Eingebauter Datentyp: [a]

7 Programmieren in Haskell

Page 8: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Allgemeine Form

data T a1 . . . am = C1 t11 . . . t1n1

| . . .

| Cr tr1 . . . trnr

T : Typkonstruktor; Ci : (Daten-)Konstruktoren; ai : Typvariablen; tij : Typenoder Typvariablen

8 Programmieren in Haskell

Page 9: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Allgemeine Form

data T a1 . . . am = C1 t11 . . . t1n1

| . . .

| Cr tr1 . . . trnr

T : Typkonstruktor; Ci : (Daten-)Konstruktoren; ai : Typvariablen; tij : Typenoder Typvariablen

8 Programmieren in Haskell

Page 10: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Selektorfunktionen auf Tupeln

fst :: (a,b) -> a -- vordefiniertfst (a,b) = a

snd :: (a,b) -> b -- vordefiniertsnd (a,b) = b

9 Programmieren in Haskell

Page 11: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Selektorfunktionen auf Listen

head :: [a] -> a -- vordefinierthead (x:xs) = x

tail :: [a] -> [a] -- vordefinierttail (x:xs) = xs

10 Programmieren in Haskell

Page 12: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Selektorfunktionen auf Musik

ton :: Musik -> Intton (Note ton dauer) = ton

dauer :: Musik -> Rationaldauer (Note ton dauer) = dauerdauer (Pause dauer) = dauer

11 Programmieren in Haskell

Page 13: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Typsynonyme

type GanzeZahl = Inttype Bruch = Rational

type Ton = GanzeZahltype Dauer = Bruch

12 Programmieren in Haskell

Page 14: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Nutzen und Gefahren von Typsynonymen

type OrdList a = [a]sort :: [a] -> OrdList a

sort xs = xs

Typ ok? JaErgebnis geordnete Liste? Nein (jedenfalls nicht im allgemeinen)

13 Programmieren in Haskell

Page 15: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Nutzen und Gefahren von Typsynonymen

type OrdList a = [a]sort :: [a] -> OrdList a

sort xs = xs

Typ ok? JaErgebnis geordnete Liste? Nein (jedenfalls nicht im allgemeinen)

13 Programmieren in Haskell

Page 16: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Nutzen und Gefahren von Typsynonymen

type OrdList a = [a]sort :: [a] -> OrdList a

sort xs = xs

Typ ok? JaErgebnis geordnete Liste? Nein (jedenfalls nicht im allgemeinen)

13 Programmieren in Haskell

Page 17: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Nutzen und Gefahren von Typsynonymen

type OrdList a = [a]sort :: [a] -> OrdList a

sort xs = xs

Typ ok? JaErgebnis geordnete Liste? Nein (jedenfalls nicht im allgemeinen)

13 Programmieren in Haskell

Page 18: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Nutzen und Gefahren von Typsynonymen

type OrdList a = [a]sort :: [a] -> OrdList a

sort xs = xs

Typ ok? JaErgebnis geordnete Liste? Nein (jedenfalls nicht im allgemeinen)

13 Programmieren in Haskell

Page 19: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Wertdefinitionen, Variablenbindungen

aShortList :: [Integer]aShortList = [1,2,3]

helloWorld :: StringhelloWorld = "Hello World"

monotonie :: Musikmonotonie = c’ (1/1) :*: monotonie

14 Programmieren in Haskell

Page 20: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Funktionsbindungen

length :: [a] -> Int -- vordefiniertlength [] = 0length (a:as) = 1 + length as

15 Programmieren in Haskell

Page 21: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Allgemeiner Fall

f p11 . . . p1n = e1

. . . = . . .

f pk1 . . . pkn = ek

pij : Muster, ei : Ausdrucke

16 Programmieren in Haskell

Page 22: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Bewachte Gleichungen

member :: (Ord a) => a -> OrdList a -> Boolmember a [] = Falsemember a (b:bs) = a >= b && (a == b || member a bs)

member a [] = Falsemember a (b:bs) = if a < b then False else

if a == b then True else member a bs

member a [] = Falsemember a (b:bs)

| a < b = False| a == b = True| a > b = member a bs

17 Programmieren in Haskell

Page 23: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Lokale Definitionen mit where

sumSquares :: Int -> Int -> IntsumSquares x y = sqX + sqY wheresqX = x * xsqY = y * y

18 Programmieren in Haskell

Page 24: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Lokale Definitionen mit let

sumSquares :: Int -> Int -> IntsumSquares x y = let sqX = x * x

sqY = y * yin sqX + sqY

19 Programmieren in Haskell

Page 25: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Abseitsregel

Das erste Zeichen der Definition unmittelbar nach dem wherebestimmt die Einrucktiefe des neu eroffneten Definitionsblocks.

Zeilen, die weiter als bis zu dieser Position eingeruckt sind, gelten alsFortsetzungen einer begonnenen lokalen Definition.

Zeilen auf gleicher Einrucktiefe beginnen eine neue Definition imlokalen Block.

Die erste geringer eingeruckte Zeile beendet den lokalen Block.

20 Programmieren in Haskell

Page 26: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Beispiel fur Abseitsregel

calc x y = calc1 x +calc2 y

wherecalc1 x = squares xwheresquares x = x * x

calc2 x = x * x * x

21 Programmieren in Haskell

Page 27: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Fallunterscheidungen

length :: [a] -> Int -- vordefiniertlength [] = 0length (a:as) = 1 + length as

length’ :: [a] -> Intlength’ as = case as of

[] -> 0a:as’ -> 1 + length’ as’

last’ :: [a] -> alast’ as = case reverse as of

a:as’ -> a

22 Programmieren in Haskell

Page 28: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Funktionsausdrucke

Ist n + 1 ein Wert oder eine Funktion?Als Funktion:

f n = n + 1

\n -> n + 1

Allgemeine Form eines Funktionsausdrucks:

\p1 . . . pn -> e .

\p1 p2 -> e als Abkurzung fur \p1 -> \p2 -> e

23 Programmieren in Haskell

Page 29: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Gestaffelte Funktionen

add :: Integer -> Integer -> Integeradd m n = m + n

add’ :: Integer -> (Integer -> Integer)add’ = \m -> \n -> m + n

24 Programmieren in Haskell

Page 30: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Gestaffelte Funktionen

note :: Int -> Int -> Dauer -> Musiknote oct h d = Note (12 * oct + h) d

note Eine Note in einer beliebigen Oktave und von beliebigerHohe und Dauer.

note 2 Eine Note in der dritten Oktave und von beliebiger Hohe undDauer.

note 2 ef Die Note f in der dritten Oktave und von beliebiger Dauer.

note 2 ef (1/4) ergibt Note 29 (1/4).

25 Programmieren in Haskell

Page 31: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Syntaktischer Zucker / Kernsprache

Mustergleichungen / case-Ausdrucke

length [] = 0length (x:xs) = 1 + length xs

length’ xs = case xs of[] -> 0(x:xs) -> 1 + length’ xs

Funktionsdefinitionen / Funktions-Ausdrucke

add m n = m + n

add’ = \m -> \n -> m + n

26 Programmieren in Haskell

Page 32: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

where-Klauseln / let-Ausdrucke

where-Klauseln / let-Ausdrucke

double n = add0 (dup n) wheredup a = (a,a)

double n = let dup a = (a,a) in add0 (dup n)

27 Programmieren in Haskell

Page 33: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Auswertung von Fallunterscheidungen

case C (e1) . . . (ek)of{. . . ; C (x1) . . . (xk)− > e; . . .}(case-Regel)⇒ e[x1/e1, . . . , xn/en]

28 Programmieren in Haskell

Page 34: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

abs :: (Ord a, Num a) => a -> aabs n = case n >= 0 of

True -> nFalse -> -n

encode :: (Num a) => Maybe a -> aencode x = case x of

Nothing -> -1Just n -> abs n

encode (Just 5)

⇒ case Just 5 of {Nothing -> -1; Just n -> abs n} (Def. encode)

⇒ abs 5 (case− Regel)

⇒ case 5 >= 0 of {True -> 5; False -> -5} (Def. abs)

⇒ case True of {True -> 5; False -> -5} (Def. >=)

⇒ 5 (case− Regel)

29 Programmieren in Haskell

Page 35: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Auswertung von Funktionsanwendungen

(\(x)− > (e))(a)⇒ e[x/a] (β-Regel)

30 Programmieren in Haskell

Page 36: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

abs = \n -> case n >= 0 of {True -> n; False -> -n}encode = \x -> case x of {Nothing -> -1; Just n -> abs n}

encode (Just 5) (Def. encode)

⇒ (\x-> case x of {Nothing-> -1; Just n-> abs n}) (Just 5)

⇒ case Just 5 of {Nothing -> -1; Just n -> abs n} (β − Regel)

⇒ abs 5 (case− Regel)

⇒ (\n -> case n >= 0 of {True -> n; False -> -n}) 5 (Def. abs)

⇒ case 5 >= 0 of {True -> 5; False -> -5} (β − Regel)

⇒ case True of {True -> 5; False -> -5} (Def. (>=))

⇒ 5 (case− Regel)

31 Programmieren in Haskell

Page 37: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

Auswertung von lokalen Definitionen

let {x1 = e1;...;xn = en} in e

⇒ e[x1/ let {x1 = e1;...;xn = en} in e1, . . . ,(let-Regel)

xn/ let {x1 = e1;...;xn = en} in en]

32 Programmieren in Haskell

Page 38: Programmieren in Haskell Syntax und Semantik von Haskell fileProgrammieren in Haskell Syntax und Semantik von Haskell Peter Ste en Universit at Bielefeld Technische Fakult at 13.11.2009

rep n a = let x = a:x in take n x

rep 2 8

⇒ let x = 8:x in take 2 x (Def. rep)

⇒ take 2 (let x = 8:x in 8:x) (let− Regel)

⇒ take 2 (8:let x = 8:x in 8:x) (let− Regel)

⇒ 8:take 1 (let x = 8:x in 8:x) (Def. take)

⇒ 8:take 1 (8:let x = 8:x in 8:x) (let− Regel)

⇒ 8:8:take 0 (let x = 8:x in 8:x) (Def. take)

⇒ 8:8:[] (Def. take)

33 Programmieren in Haskell