width: 900 height: 900 maxScale: 1.5

SE-Tutorium 4 | Mittwoch 16 - 18 Uhr:

anchored to [[191.00_anchor]]


Lernziele:

  • Probleme vorheriger Hausaufgaben
    • Feedback?
  • Fehler im Code richtig darstellen -> Warum?
    • Exceptions selber passend setzen
  • Effects verstehen und in diversen Beispielen nachvollziehen können
    • den Unterschied von Imperative Shell / Functional Core verstehen
  • Kern-Idee von Effektvollem Code und wie man damit umgehen kann

Orga | HW6 |

! \ \ Erstellt die Teams/ / !

  • gibt es Fragen zu den Aufgaben?

note: give them 20secs to think about it


ORGA | HW5 |

Fragen klären, Verständnis sammeln

note: give them maybe aroudn 10 - 30 min to think about it all to gather an idea etc


__/\ Exceptions /\__


Exceptions | Fehler Handhaben können

  • mit Exceptions können wir den Flow/Verlauf unseres Programmes verändern
  • (runtime) Fehler innerhalb der Implementation selbst tritt auf –> wer soll ihn jetzt managen?
    • Wie signalisieren wir, ob er aufgetreten ist?
  • Alternieren Flow –> werden definitiv gesehen, bei Fehlern
    • kann also bei Entwicklung nicht einfach vergessen werden

note: source https://en.wikipedia.org/wiki/Exception_handling


Exceptions | Fehler Handhaben können

  • Exceptions “blubbern” so lange nach oben, bis sie gecatched werden
    • (oder im Main-Prozess angekommen sind und es so direkt signalisieren!)
  • –> Wir müssen sie also bearbeiten
  • Programmierende können somit falsche Eingaben/Fehler nicht übersehen
    • -> Kontrast zu “Error-Codes”, die returned werden könnten
      • vielleicht vergesse ich, dass functionX auch fehlschlagen kann bei Bedingung Y
    • –> Verständlichkeit und Arbeit mit Code somit schwieriger!

note: ask about bubbling –> if it was understood fine, otherwise draw something on board!


Exceptions | Fehler Handhaben können

  • Bad: -> einfach mit Return Value (null | -1 | 0 … | = failure) ( 1 | true … = succes)!
  • Better: -> throw Exception
    • gibt an, warum es geplatzt ist ( IllegalArgument, NullType …)
    • mit der Information, kann das aufrufende Programm passend reagieren
    • (Lösung finden) (anders aufrufen) …

Exceptions | Beispiel

def algorithmX(input1,input2): Unit = 
	...
	allocateMemory(4GB)  // allocating 4GB of RAM 
	... //do something else 

@main 
def main(): = 
	// consider that our system only has 2GB of RAM 
	algorithmX(input1,input2)
	....

note: maybe 5 - 10 min, interactively ask them for possible solutions of this

  • what would be the thought process to resolve a simple issue like that ?
    • Können wir das Programm irgendwie retten?

Exceptions | Beispiel

  • Ja! –> Exceptions, die Probleme signalisieren können
  • Wenn nicht genug Platz verfügbar ist ( teste es vorher aus!), nimm weniger Platz?
  • (für Scala): https://docs.scala-lang.org/scala3/book/fp-functional-error-handling.html

Exceptions | Beispiel

def algorithmX(input1,input2,amountToAllocate): Unit = ...
@main 
def main(): = 
	// consider that our system only has 2GB of RAM 
	var allocateAmount  - 4GB
	try
		algorithmX(input1,input2,allocateAmount)	
	catch 
		case notEnoughMemory =>// do something reasonable ( reduce amount or such ) xd

note:


Exceptions | Nits:

[!Quote] exception term might be misleading The term “exception” may be misleading because its connotation of “anomaly” indicates that raising an exception is abnormal or unusual, when in fact raising the exception may be a normal and usual situation in the program.

For example, suppose a lookup function for an associative array throws an exception if the key has no value associated. Depending on context, this “key absent” exception may occur much more often than a successful lookup.

  • Error Handling kann so teils vereinfacht werden
  • –> Fehler tritt auf, kann vielleicht immer ähnlich gelöst werden (abstracting!)

note: Important that Exceptions are not always used when something might go wrong!

  • source / further reading https://en.wikipedia.org/wiki/Exception_handling
  • further reading : https://stackoverflow.com/questions/196522/in-c-what-are-the-benefits-of-using-exceptions-and-try-catch-instead-of-just
  • (am beispiel java): https://web.mit.edu/java_v1.0.2/www/tutorial/java/exceptions/definition.html

Exceptions | “Programm-Verlauf alternieren”

  • Exceptions können den Fluss des Programmes verändern
  • gutes Beispiel aus der Vorlesung:
    • (Foliensatz 06 ( Side-Effects)) Slide 52 - 66

note: ask if bubbling / idea of control flow is understood already?


Exceptions | Üben und in Programmen einbringen

[!Task] Aufgabe IM REPO: (Ex7-tut4) ||

  1. aktuelles Repo clonen
  2. Ordner “uhoh” mit IDE öffnen ( muss also darin geöffnet werden)
  3. Aufgabenstellung lesen :)
  4. Aufgabe bearbeiten
  5. Fragen und Probleme stellen / lösen
  6. Profit

note: give them around 20-30 min ?


<<|| effects ||>>


Effects | Side Effects

[!Quote] An expression is effectful, if its meaning depends on or modifies its context

BSP


(x --> x) (42)

// --- //

println("effectful?") 

note: Quote schön und gut, aber was meint sie? –> Programme sind davon abhängig wir brauchen irgendwie einen Kontext, der bestimmt, was passiert. gutes Beispiel für Effektvolle Dinge: mit I/O arbeiten


Effects | Side Effects

  • Kontext ist wichtig ( wie auch schon im letzten Tutorium betrachtet)
  • (referential transparency) fordert
  • Pure Expression –> sind nicht effektvoll!
    • also wenn wir sie nutzen, ändern sie keinen Kontext ( weil sie etwa eine Eingabe eindeutig verändern)
  • pure function –> sind auch nicht effektvoll
    • rufen wir sie mit Wert auf, kommt immer heraus –> eindeutiger Ablauf der Verarbeitung
  • Gegenbeispiel?

note: Gegenbeispiel könnte sein: –> Funktion erhält Objekt. Verändert das objekt innerhalb, zuvor könnte dieses Objekt eventuell auch schon verändert worden sein –> mit IO arbeiten ( Funktion liest Inhalt aus einer Datei aus) –> dieser Inhalt variiert! ( Kontext ist hier I/O!)


Side Effekts | Perspektive relevant

  • Scopes ( also Universum was wir betrachten) ist relevant für Evaluierung von side effects
  • Pure Funktionen ändern nur etwas innerhalb ihres Scopes!
x = x + 1 
// --> ohne Kontext effectful?!

// --- //
def increment(n:Int): Int = 
var x = n 
x = x+1 
return x 
//warum nicht effektvoll?

note: ist nicht effektvoll, weil wir x im lokalen Scope erzeugen und dann immer gleich verwenden -> Funktion ist Pure!


<< I [- Effekte -] /O >>

  • I/O bringt Effekte ins Spiel
  • aber wir brauchen IO oft!
    • Nutzer*innen Input sammeln
    • Daten auslesen und verarbeiten
    • etwas anzeigen
  • Lösungsansatz? –> Aufspalten!
    • lets introduce : functional core / imperative shell

[ Functional core ] | ]imperative shell[

  • I/O ist schwer -> undefiniert, ändert sich konstant, irgendwie nicht zu bändigen ??
  • –> Lösung: Aufteilen von Interaktion mit IO ( print Commands, auslesen von Daten, Nutzer*innen Eingaben) (imperative shell) und in Arbeit mit erhaltenen Werten (functional core)
  • imperative shell -> Interaktion mit I/O
  • functional core -> Arbeiten mit gegebenen Werten

[ Functional core ] | ]imperative shell[

  • Wichtig: Shell darf Core aufrufen, aber Core darf nicht shell aufrufen!
  • core structure weiß quasi nichts von shell ( ist ja im eigenen Kontext aktiv)
  • Das heißt jetzt:
    • Bereich mit Ein und Ausgabe, welcher diese Dinge aufnimmt und anschließend
    • Verarbeitung an den funktionalen Core setzt -> dieser ist eventuell pure
    • also gleicher Input –> gleicher Output

[ Functional core ]| Beispiel | ]imperative shell[

![[Pasted image 20231206014530.png]]



| Further resources |

  • Liste von Inhalten, die interessant sein könnten ^^
  • https://news.ycombinator.com/item?id=18043058
  • Beispiel für Aufteilung https://news.ycombinator.com/item?id=18043058
  • https://marsbased.com/blog/2020/01/20/functional-core-imperative-shell/
  • https://www.destroyallsoftware.com/screencasts/catalog/functional-core-imperative-shell
  • Unterschied func core / imp shell
  • Gründe für Options in Scala repo tutor

Effekte üben | Verstehen

[!Task] Aufgabe IM REPO: (Ex7-tut4) ||

  1. aktuelles Repo clonen
  2. Ordner “mate” mit IDE öffnen ( muss also darin geöffnet werden)
  3. Aufgabenstellung lesen :)
  4. Aufgabe bearbeiten
  5. Fragen und Probleme stellen / lösen
  6. Profit

| Feedback |

  • Hausaufgaben 5 / 6 nicht vergessen!
  • Teams für die Abgaben gründen!
  • Gerne das untere Forms ausfüllen :)

![[Pasted image 20231129010746.png]]