• Keine Ergebnisse gefunden

Fortgeschrittene Funktionale Programmierung

N/A
N/A
Protected

Academic year: 2022

Aktie "Fortgeschrittene Funktionale Programmierung"

Copied!
10
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Fortgeschrittene Funktionale Programmierung

12. Vorlesung

Janis Voigtl¨ander

Universit¨at Bonn

Wintersemester 2015/16

(2)

Motivation

Aufhttp://www-ps.iai.uni-bonn.de/ft:

(3)

Motivation

(4)

Betrachtungen zu Polymorphie

Charakterisierung von Funktioneng:: [a]→[a]:

I Wir behaupten, dass f¨ur alle g1,g2:: [a]→[a] gilt:

g1 ≡ g2 wenn f¨ur alle xs:: [Int], g1xs ≡ g2 xs K¨onnen wir das denn auch beweisen?

I Wie sieht es denn aus mit, f¨ur alleg1,g2:: [a]→[a]:

g1 ≡ g2 wenn f¨ur alle xs:: [Bool], g1 xs ≡ g2xs?

I Und/oder k¨onnen wir auf die Quantifizierung von xs ¨uber alle Listen des entsprechenden Typs verzichten?

I Was f¨ur Antworten ergeben sich, wenn wir von [a]→[a] zu Eqa⇒[a]→[a] ¨ubergehen?

I . . .

(5)

Programming Language Meta-Theory

Wir wollen eine formale Sprachbeschreibung (mit Details zu Syntax, Typsystem, Semantik) f¨ur Haskell, bzw. f¨ur eine ausgew¨ahlte Teilsprache davon.

Einige Beschr¨ankungen, die wir zum Zwecke der Beherrschbarkeit in Kauf nehmen werden:

I stark vereinfachte Syntax, ohne einen Großteil von Haskells syntactic sugar

I nur ein Ausschnitt aus der Welt der Haskell-Datentypen

I nicht alle Formen von Polymorphie, keine Typklassen

I alles als Term, keine gesonderten Programmgleichungen

(6)

Ein einfacher Lambda-Kalk¨ ul: (vereinfachte) Syntax

Termgrammatik:t :=x |n |λx.t |t t |t+t | if t == 0 thent elset wobei:

I n (0, 1, 2, . . . ): konkrete Zahlen-Literale

I x (undy,z, . . . ): Termvariablen (in Termen vorkommende . . . )

I (t,u als Metavariablen f¨ur Terme)

I zun¨achst ungetypte Funktionsabstraktion und -applikation

I relativ willk¨urliche Operationen zum Kombinieren und Konsumieren numerischer Werte

Beispielterme:

I λx.(if x == 0then 3 elsex+ 1)

I (λx.(if x == 0 then 3elsex+ 1)) 2

I λx.λy.(x y) + 4 Begrifflichkeiten:

(7)

Ein einfacher Lambda-Kalk¨ ul: (vereinfachte) Syntax

Was meinte

”alles als Term, keine gesonderten Programmgleich.“?

Dass wir keine Programme wie etwa

f=λx.(if x == 0then 3 elsex+ 1) k=f2

gx=λy.(x y) + 4 main=g f k

haben werden, sondern immer genau einen zu betrachtenden Gesamtterm, ohne weiteren Programmkontext:

(λx.λy.(x y) + 4) (λx.(if x == 0then 3 elsex+ 1)) ((λx.(if x == 0 then3 elsex+ 1)) 2) Potentielle Probleme mit dieser Betrachtung:

I aus pragmatischer Sicht: Modularit¨at, separate compilation?

I aus theoretischer Sicht: Was ist mit Rekursion?

I falls mal Effizienz von Interesse: kein Top-Level-Sharing?

(8)

Ein einfacher Lambda-Kalk¨ ul: Typsystem

I Um nur

”sinnvolle“ Terme zu betrachten, Einf¨uhrung von Typen.

I F¨ur die bisher gesehenen Beispiele w¨urden aus Nat und→ aufgebaute Typen reichen.

I Wir f¨uhren aber gleich auch noch Typvariablen (α,β, . . . ) ein (f¨ur letztlich Polymorphie), also:

Typgrammatik:τ :=α |τ →τ |Nat

I Auf Termebene f¨uhren wir lediglich bei Funktionsabstraktionen eine Typannotation ein: λx :τ.t stattλx.t

I Schließlich brauchen wir

”nur“ noch eine Beschreibung, welche Terme wohlgetypt sind, und mit welchen konkreten Gesamttypen . . .

(9)

Ein einfacher Lambda-Kalk¨ ul: Typsystem

Typen: τ :=α |τ →τ |Nat

Terme: t:=x|n|λx:τ.t|t t|t+t|ift == 0thentelset Γ,x :τ `x :τ

Γ`n : Nat

Γ`t:τ1 →τ2 Γ`u:τ1 Γ`(t u) :τ2

Γ,x:τ1`t:τ2 Γ`(λx:τ1.t) :τ1→τ2 Γ`t : Nat Γ`u : Nat

Γ`(t+u) : Nat

Γ`t: Nat Γ`u1:τ Γ`u2 :τ Γ`(if t == 0 thenu1 else u2) :τ

Begrifflichkeiten:

I typing contexts Γ

I typing judgements

I well-formedness

I freshness conventions

I type derivations

(10)

Beispiel f¨ ur eine Typableitung

Γ`g : (γβ)γ

Γ,y :γ`f :αβ Γ,y:γ`x:α Γ,y:γ`(f x) :β

Γ`(λy :γ.f x) :γβ Γ`(g (λy :γ.f x)) :γ

α, β, γ,f :αβ,g : (γβ)γ`(λx :α.g (λy :γ.f x)) :αγ α, β, γ,f :αβ`(λg :· · · .λx:α.g (λy:γ.f x)) : ((γβ)γ)αγ

α, β, γ`(λf :αβ.λg : (γβ)γ.λx:α.g (λy :γ.f x)) :τ wobei τ = (α→β)→((γ →β)→γ)→α→γ

Γ =α, β, γ,f :α→β,g : (γ →β)→γ,x :α

Referenzen

ÄHNLICHE DOKUMENTE

Bei der Big-Step- Semantik interessiert nur der Endzustand einer Programmausf¨ uhrung, w¨ahrend eine Ableitungsfol- ge in der Small-Step-Semantik zus¨atzlich alle

Bei der Big-Step- Semantik interessiert nur der Endzustand einer Programmausf¨ uhrung, w¨ahrend eine Ableitungsfol- ge in der Small-Step-Semantik zus¨atzlich alle

An die Quellensektion schließen zwei direkt aneinander gekoppelte RFQ-(Radio-Frequency-Quadrupole)-Resonatoren mit einer Gesamtl¨ange von 6 m an, die die Ionen auf 0.5

This examples shows, that the cell-centered Finite Volume Method, Discontinuous Galerkin Method and Mixed Finite Elements Method tend to underestimate the overall flux, the Finite

Impr¨ adikativer Polymorphismus: Typvariablen stehen auch f¨ ur polymorphe Typen (mit Quantoren!). Versuch \x -> const (x True) (x 'A')

TCS | 07 Typisierung | SoSe 2020 2/108 Motivation Typen Typisierungsverfahren..

kein Zusammenhang zwischen Zero und Succ auch der unsinnige Typ Vec Bool String ist erlaubt Ursache: Kind von Vec ist zu allgemein: * -> * -> *. Wunsch-Kind: Nat -> * ->

Die ersten 0 Elemente einer Liste sind durch die leere Liste gegeben. Ist n > 0, die Liste aber bereits leer, so ist das Ergebnis die