• Keine Ergebnisse gefunden

Errors in Haskell •

N/A
N/A
Protected

Academic year: 2022

Aktie "Errors in Haskell •"

Copied!
54
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Errors in Haskell

• let averagexs =div (sum xs) (lengthxs) in average[ ]

• let tail(x :xs) =xs in tail[ ]

• if · · · thenerror “some string” else · · ·

• let loop=loop in loop

Traditionell, oft alle Fehlerursachen unter „⊥“ subsumiert. Besser, feinere Unterscheidung. Etwa wie folgt:

Ok v : nicht fehlerbehaftet Bad “· · ·” : endlich fehlerbehaftet

⊥ : nicht terminierend

(2)

Errors in Haskell

• let averagexs =div (sum xs) (lengthxs) in average[ ]

• let tail(x :xs) =xs in tail[ ]

• if · · · thenerror “some string” else · · ·

• let loop=loop in loop

Traditionell, oft alle Fehlerursachen unter „⊥“ subsumiert. Besser, feinere Unterscheidung. Etwa wie folgt:

Ok v : nicht fehlerbehaftet Bad “· · ·” : endlich fehlerbehaftet

⊥ : nicht terminierend

(3)

Errors in Haskell

• let averagexs =div (sum xs) (lengthxs) in average[ ]

• let tail(x :xs) =xs in tail[ ]

• if · · · thenerror “some string” else · · ·

• let loop=loop in loop

Traditionell, oft alle Fehlerursachen unter „⊥“ subsumiert. Besser, feinere Unterscheidung. Etwa wie folgt:

Ok v : nicht fehlerbehaftet Bad “· · ·” : endlich fehlerbehaftet

⊥ : nicht terminierend

(4)

Errors in Haskell

• let averagexs =div (sum xs) (lengthxs) in average[ ]

• let tail(x :xs) =xs in tail[ ]

• if · · · thenerror “some string” else · · ·

• let loop=loop in loop

Traditionell, oft alle Fehlerursachen unter „⊥“ subsumiert. Besser, feinere Unterscheidung. Etwa wie folgt:

Ok v : nicht fehlerbehaftet Bad “· · ·” : endlich fehlerbehaftet

⊥ : nicht terminierend

(5)

Errors in Haskell

• let averagexs =div (sum xs) (lengthxs) in average[ ]

• let tail(x :xs) =xs in tail[ ]

• if · · · thenerror “some string” else · · ·

• let loop=loop in loop

Traditionell, oft alle Fehlerursachen unter „⊥“ subsumiert.

Besser, feinere Unterscheidung. Etwa wie folgt: Ok v : nicht fehlerbehaftet

Bad “· · ·” : endlich fehlerbehaftet

⊥ : nicht terminierend

(6)

Errors in Haskell

• let averagexs =div (sum xs) (lengthxs) in average[ ]

• let tail(x :xs) =xs in tail[ ]

• if · · · thenerror “some string” else · · ·

• let loop=loop in loop

Traditionell, oft alle Fehlerursachen unter „⊥“ subsumiert.

Besser, feinere Unterscheidung. Etwa wie folgt:

Ok v : nicht fehlerbehaftet

(7)

Fortpflanzung von Fehlern

• tail[1/0,2.5] Ok ((Ok 2.5) : (Ok [ ]))

• (λx →3) (error “· · ·”) Ok 3

• (errors) (· · ·) Bad s

• case(error s) of {· · · } Bad s

• (errors1) + (error s2) ???

Abhängigkeit von Auswertungsreihenfolge führt zu erheblichen Einschränkungen der Implementationsfreiheit!

(8)

Fortpflanzung von Fehlern

• tail[1/0,2.5] Ok ((Ok 2.5) : (Ok [ ]))

• (λx →3) (error “· · ·”) Ok 3

• (errors) (· · ·) Bad s

• case(error s) of {· · · } Bad s

• (errors1) + (error s2) ???

Abhängigkeit von Auswertungsreihenfolge führt zu erheblichen Einschränkungen der Implementationsfreiheit!

(9)

Fortpflanzung von Fehlern

• tail[1/0,2.5] Ok ((Ok 2.5) : (Ok [ ]))

• (λx →3) (error “· · ·”) Ok 3

• (errors) (· · ·) Bad s

• case(error s) of {· · · } Bad s

• (errors1) + (error s2) ???

Abhängigkeit von Auswertungsreihenfolge führt zu erheblichen Einschränkungen der Implementationsfreiheit!

(10)

Fortpflanzung von Fehlern

• tail[1/0,2.5] Ok ((Ok 2.5) : (Ok [ ]))

• (λx →3) (error “· · ·”) Ok 3

• (errors) (· · ·) Bad s

• case(error s) of {· · · } Bad s

• (errors1) + (error s2) ???

Abhängigkeit von Auswertungsreihenfolge führt zu erheblichen Einschränkungen der Implementationsfreiheit!

(11)

Fortpflanzung von Fehlern

• tail[1/0,2.5] Ok ((Ok 2.5) : (Ok [ ]))

• (λx →3) (error “· · ·”) Ok 3

• (errors) (· · ·) Bad s

• case(error s) of {· · · } Bad s

• (errors1) + (error s2) ???

Abhängigkeit von Auswertungsreihenfolge führt zu erheblichen Einschränkungen der Implementationsfreiheit!

(12)

Fortpflanzung von Fehlern

• tail[1/0,2.5] Ok ((Ok 2.5) : (Ok [ ]))

• (λx →3) (error “· · ·”) Ok 3

• (errors) (· · ·) Bad s

• case(error s) of {· · · } Bad s

• (errors1) + (error s2) ???

Abhängigkeit von Auswertungsreihenfolge führt zu erheblichen

(13)

Imprecise Error Semantics [Peyton Jones et al. 1999]

Grundidee:

Ok v : nicht fehlerbehaftet

Bad {· · · } : endlich fehlerbehaftet, nichtdeterministisch

⊥ : nicht terminierend

Definiertheits-Ordnung:

(14)

Imprecise Error Semantics [Peyton Jones et al. 1999]

Grundidee:

Ok v : nicht fehlerbehaftet

Bad {· · · } : endlich fehlerbehaftet, nichtdeterministisch

⊥ : nicht terminierend

Definiertheits-Ordnung:

Ok Bad

(15)

Imprecise Error Semantics [Peyton Jones et al. 1999]

Grundidee:

Ok v : nicht fehlerbehaftet

Bad {· · · } : endlich fehlerbehaftet, nichtdeterministisch

⊥ : nicht terminierend

Definiertheits-Ordnung:

Ok Bad

Bad e2

Bad e1 e2e1

(16)

Imprecise Error Semantics [Peyton Jones et al. 1999]

Fortpflanzung von Fehlern:

• (errors1) + (error s2) Bad {s1,s2}

• 3+ (errors) Bad {s}

• loop+ (error s) ⊥

• (errors1) (error s2) Bad {s1,s2}

• (λx →3) (error s) Ok 3

• case(error s1) of {(x,y)→errors2} Bad {s1,s2}

(17)

Imprecise Error Semantics [Peyton Jones et al. 1999]

Fortpflanzung von Fehlern:

• (errors1) + (error s2) Bad {s1,s2}

• 3+ (errors) Bad {s}

• loop+ (error s) ⊥

• (errors1) (error s2) Bad {s1,s2}

• (λx →3) (error s) Ok 3

• case(error s1) of {(x,y)→errors2} Bad {s1,s2}

(18)

Imprecise Error Semantics [Peyton Jones et al. 1999]

Fortpflanzung von Fehlern:

• (errors1) + (error s2) Bad {s1,s2}

• 3+ (errors) Bad {s}

• loop+ (error s) ⊥

• (errors1) (error s2) Bad {s1,s2}

• (λx →3) (error s) Ok 3

• case(error s1) of {(x,y)→errors2} Bad {s1,s2}

(19)

Imprecise Error Semantics [Peyton Jones et al. 1999]

Fortpflanzung von Fehlern:

• (errors1) + (error s2) Bad {s1,s2}

• 3+ (errors) Bad {s}

• loop+ (error s) ⊥

• (errors1) (errors2) Bad {s1,s2}

• (λx →3) (error s) Ok 3

• case(error s1) of {(x,y)→errors2} Bad {s1,s2}

(20)

Imprecise Error Semantics [Peyton Jones et al. 1999]

Fortpflanzung von Fehlern:

• (errors1) + (error s2) Bad {s1,s2}

• 3+ (errors) Bad {s}

• loop+ (error s) ⊥

• (errors1) (errors2) Bad {s1,s2}

• (λx →3) (error s) Ok 3

• case(error s1) of {(x,y)→errors2} Bad {s1,s2}

(21)

Imprecise Error Semantics [Peyton Jones et al. 1999]

Fortpflanzung von Fehlern:

• (errors1) + (error s2) Bad {s1,s2}

• 3+ (errors) Bad {s}

• loop+ (error s) ⊥

• (errors1) (errors2) Bad {s1,s2}

• (λx →3) (error s) Ok 3

• case(error s1) of {(x,y)→errors2} Bad {s1,s2}

(22)

Auswirkungen auf Programmäquivalenz

„Normalerweise“:

takeWhilep (map h l) = map h (takeWhile(p◦h)l) wobei:

takeWhile:: (α→Bool)→[α]→[α]

takeWhilep [ ] = [ ]

takeWhilep (a:as) | p a =a:takeWhile p as

| otherwise= [ ] map:: (α→β)→[α]→[β]

map h [ ] = [ ]

map h (a:as) =h a:maph as

Aber nun:

takeWhile null(map tail(error s))

s

6

=

map tail(takeWhile(null◦tail) (error s))

s oder “empty list”

(23)

Auswirkungen auf Programmäquivalenz

„Normalerweise“:

takeWhilep (map h l) = map h (takeWhile(p◦h)l) wobei:

takeWhile:: (α→Bool)→[α]→[α]

takeWhilep [ ] = [ ]

takeWhilep (a:as) | p a =a:takeWhile p as

| otherwise= [ ] map:: (α→β)→[α]→[β]

map h [ ] = [ ]

map h (a:as) =h a:maph as

Aber nun:

takeWhile null(map tail(error s))

s

6

=

map tail(takeWhile(null◦tail) (error s))

s oder “empty list”

(24)

Auswirkungen auf Programmäquivalenz

„Normalerweise“:

takeWhilep (map h l) = map h (takeWhile(p◦h)l) wobei:

takeWhile:: (α→Bool)→[α]→[α]

takeWhilep [ ] = [ ]

takeWhilep (a:as) | p a =a:takeWhile p as

| otherwise= [ ] map:: (α→β)→[α]→[β]

map h [ ] = [ ]

map h (a:as) =h a:maph as Aber nun:

(25)

Auswirkungen auf Programmäquivalenz

Denn:

takeWhile(null◦tail) (errors) Bad {s,“empty list”}

wobei:

takeWhile p [ ] = [ ]

takeWhile p (a:as) | p a =a: (takeWhile p as)

| otherwise= [ ] tail [ ] =error “empty list”

tail (a:as) =as null [ ] =True null (a:as) =False

(26)

Auswirkungen auf Programmäquivalenz

Denn:

takeWhile(null◦tail) (errors) Bad {s,“empty list”}

wobei:

takeWhile p [ ] = [ ]

takeWhile p (a:as) | p a =a: (takeWhile p as)

| otherwise= [ ] tail [ ] =error “empty list”

tail (a:as) =as

(27)

Auswirkungen auf Programmäquivalenz

Denn:

takeWhile(null◦tail) (errors) Bad {s,“empty list”}

wobei:

takeWhile p [ ] = [ ]

takeWhile p (a:as) | p a =a: (takeWhile p as)

| otherwise= [ ] tail [ ] =error “empty list”

tail (a:as) =as null [ ] =True null (a:as) =False

(28)

Auswirkungen auf Programmäquivalenz

Denn:

takeWhile(null◦tail) (errors) Bad {s,“empty list”}

wobei:

takeWhile p [ ] = [ ]

takeWhile p (a:as) | p a =a: (takeWhile p as)

| otherwise= [ ] tail [ ] =error “empty list”

tail (a:as) =as

(29)

Auswirkungen auf Programmäquivalenz

Denn:

takeWhile(null◦tail) (errors) Bad {s,“empty list”}

wobei:

takeWhile p [ ] = [ ]

takeWhile p (a:as) | p a =a: (takeWhile p as)

| otherwise= [ ] tail [ ] =error “empty list”

tail (a:as) =as null [ ] =True null (a:as) =False

(30)

Auswirkungen auf Programmäquivalenz

Denn:

takeWhile(null◦tail) (errors) Bad {s,“empty list”}

wobei:

takeWhile p [ ] = [ ]

takeWhile p (a:as) | p a =a: (takeWhile p as)

| otherwise= [ ] tail [ ] =error “empty list”

tail (a:as) =as

(31)

Auswirkungen auf Programmäquivalenz

Denn:

takeWhile(null◦tail) (errors) Bad {s,“empty list”}

wobei:

takeWhile p [ ] = [ ]

takeWhile p (a:as) | p a =a: (takeWhile p as)

| otherwise= [ ] tail [ ] =error “empty list”

tail (a:as) =as null [ ] =True null (a:as) =False

(32)

Auswirkungen auf Programmäquivalenz

Denn:

takeWhile(null◦tail) (errors) Bad {s,“empty list”} während:

takeWhile null (map tail(errors)) Bad {s} wobei:

takeWhile p [ ] = [ ]

takeWhile p (a:as) | p a =a: (takeWhile p as)

| otherwise= [ ] map h [ ] = [ ]

map h (a:as) = (h a) : (map h as)

(33)

Auswirkungen auf Programmäquivalenz

Denn:

takeWhile(null◦tail) (errors) Bad {s,“empty list”} während:

takeWhile null (map tail(errors)) Bad {s} wobei:

takeWhile p [ ] = [ ]

takeWhile p (a:as) | p a =a: (takeWhile p as)

| otherwise= [ ] map h [ ] = [ ]

map h (a:as) = (h a) : (map h as) null [ ] =True

null (a:as) =False

(34)

Auswirkungen auf Programmäquivalenz

Denn:

takeWhile(null◦tail) (errors) Bad {s,“empty list”} während:

takeWhile null (map tail(errors)) Bad {s} wobei:

takeWhile p [ ] = [ ]

takeWhile p (a:as) | p a =a: (takeWhile p as)

| otherwise= [ ] map h [ ] = [ ]

map h (a:as)= (h a) : (map h as)

(35)

Auswirkungen auf Programmäquivalenz

Denn:

takeWhile(null◦tail) (errors) Bad {s,“empty list”} während:

takeWhile null (map tail(errors)) Bad {s} wobei:

takeWhile p [ ] = [ ]

takeWhile p (a:as) | p a =a: (takeWhile p as)

| otherwise= [ ] map h [ ] = [ ]

map h (a:as) = (h a) : (map h as) null [ ] =True

null (a:as) =False

(36)

Auswirkungen auf Programmäquivalenz

Denn:

takeWhile(null◦tail) (errors) Bad {s,“empty list”} während:

takeWhile null (map tail(errors)) Bad {s} wobei:

takeWhile p [ ] = [ ]

takeWhile p (a:as) | p a =a: (takeWhile p as)

| otherwise= [ ] map h [ ] = [ ]

map h (a:as) = (h a) : (map h as)

(37)

Auswirkungen auf Programmäquivalenz

Denn:

takeWhile(null◦tail) (errors) Bad {s,“empty list”} während:

takeWhile null(map tail(errors)) Bad {s} wobei:

takeWhile p [ ] = [ ]

takeWhile p (a:as) | p a =a: (takeWhile p as)

| otherwise= [ ] map h [ ] = [ ]

map h (a:as) = (h a) : (map h as) null [ ] =True

null (a:as) =False

(38)

Auswirkungen auf Programmäquivalenz

Denn:

takeWhile(null◦tail) (errors) Bad {s,“empty list”} während:

takeWhile null (map tail(errors)) Bad {s} Also:

takeWhile null (map tail(error s))

6

=

map tail(takeWhile(null◦tail) (error s))

(39)

Auswirkungen auf Programmäquivalenz

Denn:

takeWhile(null◦tail) (errors) Bad {s,“empty list”} während:

takeWhile null (map tail(errors)) Bad {s} Also:

takeWhile null (map tail(error s))

6

=

map tail(takeWhile(null◦tail) (error s)) Man stelle sich dies in folgendem Kontext vor:

catchJust errorCalls(evaluate · · ·)

(λs →if s==“empty list”

thenreturn [[42]]

else return [ ])

(40)

Freies Theorem

Bisheriger Kenntnisstand:

g p (map h l) = map h (g (p◦h) l) für jedesg:: (α→Bool)→[α]→[α], wenn

• p6=⊥,

• h strikt (h ⊥=⊥) und

• h total (∀x 6=⊥.h x6=⊥).

Was sind entsprechende Bedingungen „in echt“?

Ok Bad

(41)

Freies Theorem

Bisheriger Kenntnisstand:

g p (map h l) = map h (g (p◦h) l) für jedesg:: (α→Bool)→[α]→[α], wenn

• p6=⊥,

• h strikt (h ⊥=⊥) und

• h total (∀x 6=⊥.h x6=⊥).

Was sind entsprechende Bedingungen „in echt“?

Ok Bad

(42)

Schweiß und Tränen . . .

. . . durchgängige Formalisierung der Semantik

. . . Einstieg in Beweis des Parametrizitäts-Theorems . . . Betrachtung der interessanten Induktionsfälle

. . . Identifizierung geeigneter Bedingungen auf Relationsebene . . . Anpassung relationaler Aktionen

. . . Vervollständigung allgemeiner Beweis

. . . Übertragung der Bedingungen auf Funktionsebene . . . Anwendung auf konkrete Funktionen

(43)

Schweiß und Tränen . . .

. . . durchgängige Formalisierung der Semantik . . . Einstieg in Beweis des Parametrizitäts-Theorems

. . . Betrachtung der interessanten Induktionsfälle

. . . Identifizierung geeigneter Bedingungen auf Relationsebene . . . Anpassung relationaler Aktionen

. . . Vervollständigung allgemeiner Beweis

. . . Übertragung der Bedingungen auf Funktionsebene . . . Anwendung auf konkrete Funktionen

(44)

Schweiß und Tränen . . .

. . . durchgängige Formalisierung der Semantik . . . Einstieg in Beweis des Parametrizitäts-Theorems . . . Betrachtung der interessanten Induktionsfälle

. . . Identifizierung geeigneter Bedingungen auf Relationsebene . . . Anpassung relationaler Aktionen

. . . Vervollständigung allgemeiner Beweis

. . . Übertragung der Bedingungen auf Funktionsebene . . . Anwendung auf konkrete Funktionen

(45)

Schweiß und Tränen . . .

. . . durchgängige Formalisierung der Semantik . . . Einstieg in Beweis des Parametrizitäts-Theorems . . . Betrachtung der interessanten Induktionsfälle

. . . Identifizierung geeigneter Bedingungen auf Relationsebene

. . . Anpassung relationaler Aktionen . . . Vervollständigung allgemeiner Beweis

. . . Übertragung der Bedingungen auf Funktionsebene . . . Anwendung auf konkrete Funktionen

(46)

Schweiß und Tränen . . .

. . . durchgängige Formalisierung der Semantik . . . Einstieg in Beweis des Parametrizitäts-Theorems . . . Betrachtung der interessanten Induktionsfälle

. . . Identifizierung geeigneter Bedingungen auf Relationsebene . . . Anpassung relationaler Aktionen

. . . Vervollständigung allgemeiner Beweis

. . . Übertragung der Bedingungen auf Funktionsebene . . . Anwendung auf konkrete Funktionen

(47)

Schweiß und Tränen . . .

. . . durchgängige Formalisierung der Semantik . . . Einstieg in Beweis des Parametrizitäts-Theorems . . . Betrachtung der interessanten Induktionsfälle

. . . Identifizierung geeigneter Bedingungen auf Relationsebene . . . Anpassung relationaler Aktionen

. . . Vervollständigung allgemeiner Beweis

. . . Übertragung der Bedingungen auf Funktionsebene . . . Anwendung auf konkrete Funktionen

(48)

Schweiß und Tränen . . .

. . . durchgängige Formalisierung der Semantik . . . Einstieg in Beweis des Parametrizitäts-Theorems . . . Betrachtung der interessanten Induktionsfälle

. . . Identifizierung geeigneter Bedingungen auf Relationsebene . . . Anpassung relationaler Aktionen

. . . Vervollständigung allgemeiner Beweis

. . . Übertragung der Bedingungen auf Funktionsebene

. . . Anwendung auf konkrete Funktionen

(49)

Schweiß und Tränen . . .

. . . durchgängige Formalisierung der Semantik . . . Einstieg in Beweis des Parametrizitäts-Theorems . . . Betrachtung der interessanten Induktionsfälle

. . . Identifizierung geeigneter Bedingungen auf Relationsebene . . . Anpassung relationaler Aktionen

. . . Vervollständigung allgemeiner Beweis

. . . Übertragung der Bedingungen auf Funktionsebene . . . Anwendung auf konkrete Funktionen

(50)

. . . Anwendung auf „takeWhile“

Für jedesg:: (α→Bool)→[α]→[α],

g p (map h l) = map h (g (p◦h) l)

vorausgesetzt

• p undh nicht fehlerbehaftet,

• h ⊥=⊥,

• h verhält sich als Identität auf endlichen Fehlern, und

• h bildet Nichtfehler auf Nichtfehler ab.

(51)

. . . Anwendung auf „takeWhile“

Für jedesg:: (α→Bool)→[α]→[α],

g p (map h l) = map h (g (p◦h) l) vorausgesetzt

• p undh nicht fehlerbehaftet,

• h ⊥=⊥,

• h verhält sich als Identität auf endlichen Fehlern, und

• h bildet Nichtfehler auf Nichtfehler ab.

Ok Bad

h p

(52)

. . . Anwendung auf „takeWhile“

Für jedesg:: (α→Bool)→[α]→[α],

g p (map h l) = map h (g (p◦h) l) vorausgesetzt

• p undh nicht fehlerbehaftet,

• h ⊥=⊥,

• h verhält sich als Identität auf endlichen Fehlern, und

• h bildet Nichtfehler auf Nichtfehler ab.

Ok Bad

h p

(53)

. . . Anwendung auf „takeWhile“

Für jedesg:: (α→Bool)→[α]→[α],

g p (map h l) = map h (g (p◦h) l) vorausgesetzt

• p undh nicht fehlerbehaftet,

• h ⊥=⊥,

• h verhält sich als Identität auf endlichen Fehlern, und

• h bildet Nichtfehler auf Nichtfehler ab.

Ok Bad

h p

h h

h

(54)

. . . Anwendung auf „takeWhile“

Für jedesg:: (α→Bool)→[α]→[α],

g p (map h l) = map h (g (p◦h) l) vorausgesetzt

• p undh nicht fehlerbehaftet,

• h ⊥=⊥,

• h verhält sich als Identität auf endlichen Fehlern, und

• h bildet Nichtfehler auf Nichtfehler ab.

Ok Bad

h p

h h h h

Referenzen

ÄHNLICHE DOKUMENTE

Imprecise Error Semantics [Peyton Jones et al... Imprecise Error Semantics [Peyton Jones

(2009) Predic- tors of spontaneous and systematically assessed suicidal adverse events in the treatment of SSRI-resistant depression in adolescents (TORDIA) study..

Hill NR, Lasserson D, Thompson B, et al.: Benefits of Aldosterone Receptor Antagonism in Chronic Kidney Disease (BARACK D) trial-a multi-centre, prospective, randomised,

Ihre Freude an der Arbeit mit Zahlen wird wahrscheinlich eine leicht positive Auswirkung auf die Zufriedenheit im Job und/oder auf die Leistung

This work has been digitalized and published in 2013 by Verlag Zeitschrift für Naturforschung in cooperation with the Max Planck Society for the Advancement of Science under

In der dort dargestellten Biografie des US- amerikanischen Medizin-Nobelpreis- trägers und Pathologen Francis Pey- ton Rous (1879 bis 1970), der 1966 für die Entdeckung

Iawn i’r cymeriad ffuglennol obeithio wrth ysgrifennu adref at ei frawd y bydd ‘mentr fel hon yn dipyn o sbardun iddo ‘fynta ar ddechra’i yrfa fel pregethwr’ (6), ond brolio

Dass diese Verdrängung der Autorin durch ihren medialen Bastard nicht nur innerhalb des Filmes stattfindet, sondern auch in die Realität überschwappte, zeigt ein Wochenschaubericht