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