Funktionale Programmierung bringt`s! Ein Ausflug mit Haskell in die

Werbung
Funktionale Programmierung bringt’s!
Ein Ausflug mit Haskell in die Praxis
Stefan Wehr ([email protected])
factis research GmbH, Freiburg im Breisgau
17. Juli 2013
Developer MeetUp Freiburg
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
1 / 20
Wer bin ich? Was machen wir?
I
I
I
I
I
I
factis research GmbH, Freiburg im Breisgau
Vier feste, etwas sechs freie Mitarbeiter
Softwareprodukte für den Medizin- und Pflegebereich
Komplexe mobile Anwendungen
Serverseitige Software fast ausschließlich in funktionalen
Sprachen geschrieben
Projekte und Schulungen im Bereich funktionale
Programmierung und mobile Anwendungen
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
2 / 20
Checkpad MED
I
Elektronische Patientenakte auf dem iPad
I
I
I
I
I
Lines of Code:
I
I
I
I
I
Bringt alle Patientendaten zusammen
Unterstützt Krankenhausärzte bei Arbeitsabläufen
Unabhängig vom KIS (Krankenhausinformationssystem)
Demo
100.000 Zeilen Haskell
35.000 Zeilen Scala
56.000 Zeilen Objective-C
Entwicklung seit 2010
Heute: erster zahlender Kunde, Pilotbetrieb in mehreren
Krankenhäusern
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
3 / 20
Architektur von Checkpad
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
4 / 20
Was ist funktionale Programmierung?
I
I
Der nächste Hype?
Akademischer Blödsinn?
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
5 / 20
Was ist funktionale Programmierung?
I
I
Der nächste Hype?
Akademischer Blödsinn?
Die Wahrheit liegt irgendwo in der Mitte!
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
5 / 20
Was also ist funktionale Programmierung?
I
Kontrolle über Seiteneffekte
I
I
I
I
Einfaches Abstrahieren
I
I
I
Funktionen als Werte
Eigene Kontrollstrukturen
Einfache Datenmodellierung
I
I
I
Unveränderliche Datenstrukturen
APIs sind oft zustandslos
Seiteneffekte durch Typen kontrolliert
Records
Fallunterscheidung
Oftmals: Typprüfung beim Kompilieren
I
I
I
Vermeidet Fehler ohne das Programm auszuführen
Typen werden oft automatisch inferiert
Viele Invarianten als Typen kodierbar
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
6 / 20
Warum funktionale Programmierung?
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
7 / 20
Kann ich mal ein paar Beispiele sehen?
I
Kontrolle über Seiteneffekte
insert :: Ord k => k -> a -> Map k a -> Map k a
I
Abstraktionsmöglichkeiten
-- Eine *Bibliotheks*funktion
withFile :: FilePath
-> IOMode
-> (Handle -> IO a)
-> IO a
-- Verwendung
withFile "foo.txt" WriteMode $
\handle -> hPutStrLn handle "Hello World!"
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
8 / 20
Mehr Beispiele
I
Einfache Datenmodellierung
data Person = Person {
name :: String,
contactInfo :: Maybe ContactInfo
} deriving (Show, Eq)
data ContactInfo =
PhoneNumber String
| EmailAddress String
deriving (Show, Eq)
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
9 / 20
Und noch mehr Beispiele
I
Typen
displayPerson :: Person -> String
displayPerson person =
name person ++
(case contactInfo person of
Just (PhoneNumber phone) -> ", phone: " ++ phone
Just (EmailAddress adrr) -> ", email: " ++ addr
Nothing -> "no contact info")
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
10 / 20
Was machen wir mit funktionaler Programmierung?
I
I
I
I
I
I
I
XML-Verarbeitung
Datenbankzugriffe
Webprogrammierung
Serialisierung (binär, JSON, Google Protocol Buffers)
Buildsystem
Netzwerkserver
...
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
11 / 20
Beispiel: Webprogrammierung mit Haskell
I
Mapping zwischen Datentyp und Datenbanktabelle
$(share [mkPersist sqlSettings, mkMigrate "migrateAll"]
[persistUpperCase|
NewsItem
title T.Text
content T.Text
tags [T.Text]
author T.Text
deriving Show Eq
|]
)
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
12 / 20
Beispiel: Webprogrammierung mit Haskell
I
JSON Serialisierung/Deserialisierung
instance ToJSON (Entity NewsItem) where
toJSON (Entity nid (NewsItem title content tags author))
object ["id" .= nid, "title" .= title
,"content" .= content, "tags" .= tags
,"author" .= author]
instance FromJSON NewsItem where
parseJSON (Object v) =
do title <- v .: "title"
content <- v .: "content"
tags <- v .: "tags"
author <- v .: "author"
return $ NewsItem title content tags author
parseJSON _ = mzero
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
13 / 20
Beispiel: Webprogrammierung mit Haskell
I
JSON vs. Haskell-Datentype
{
"title": "Hallo Blog",
"content": "Das hier ist mein erster Beitrag",
"author": "Stefan Wehr",
"tags": ["blog", "haskell", "toll"]
}
NewsItem { title = "Hallo Blog",
content = "Das hier ist mein erster Beitrag",
author = "Stefan Wehr"
tags = ["blog", "haskell", "toll"] }
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
14 / 20
Beispiel: Webprogrammierung mit Haskell
scotty port $
do defineStatic "/" "static/index.html" CtHtml
defineStatic "/jquery.min.js" "static/jquery.min.js"
CtJavaScript
get "/news" $ do response <- runDB query
json response
where
query = SQL.selectList [] [SQL.Desc NewsItemId]
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
15 / 20
Wer arbeitet mit funktionalen Programmiersprachen?
I
I
I
I
I
I
Twitter: Large-scale Internet Services in Scala
Microsoft: F#
Banken wie Standard Chartered, Credit Suisse, Deutsche Bank
Ericsson: Erlang
Intel
Facebook
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
16 / 20
Beispiele für funktionale Sprachen
I
Haskell
I
I
Scala
I
I
I
I
I
I
JVM-basiert
dynamisch getypt
Erlang
I
I
JVM-basiert
statisch getypt
Clojure
I
I
Mächtiges Typsystem
für hochverfügbare Telekommunikationssysteme
Scheme, Lisp
OCaml
F#
I
.NET Sprache
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
17 / 20
Funktionale Programmierung in nicht-funktionalen
Sprachen
I
I
I
Unveränderliche Datentypen
Bewusster Umgang mit Seiteneffekten
Funktionen als Werte, anonyme Funktionen
I
I
I
I
I
Java 8
C#
Objective-C
C++
Python
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
18 / 20
Resourcen
I
I
I
I
I
I
I
School of Haskell: https://www.fpcomplete.com/
Learn You a Haskell for Great Good, Miran Lipovača, No
Starch Press, 2011 http://learnyouahaskell.com/
Real World Haskell, Bryan O’Sullivan, Don Stewart und John
Goerzen, O’Reilly 2008
http://book.realworldhaskell.org/
Functional Programming Principles in Scala, Martin Odersky:
https://www.coursera.org/course/progfun
Vortrag von Tim Sweeney, Epic Games: In a concurrent world,
imperative is the wrong default!
http://www.st.cs.uni-saarland.de/edu/seminare/
2005/advanced-fp/docs/sweeny.pdf
Blog über Funktionale Programmierung:
http://funktionale-programmierung.de/
Folien zum Vortrag: http://factisresearch.com/
resources/wehr_fr-2013-07.pdf
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
19 / 20
Fazit & Zusammenfassung
I
I
Mit funktionaler Programmierung wird kommerzielle Software
entwickelt!
Funktionale Programmierung punktet auch in der Industrie:
I
I
I
I
I
Hohe Produktivität
Korrektheit
Sicherheit
Hohe Wiederverwendbarkeit
Wichtigste Erkenntnis beim Arbeiten mit funktionalen
Sprachen:
I
Seiteneffekte nur kontrolliert einsetzen
Funktionale Programmierung bringt’s! Ein Ausflug mit Haskell in die Praxis
20 / 20
Herunterladen