Alejandra Holman | Diego Parra | Cristian Spinetta
"As software becomes more and more complex, it is more and more important to structure it well. Well-structured software is easy to write and to debug, and provides a collection of modules that can be reused to reduce future programming costs. In this paper we show that two features of functional languages in particular, higher-order functions and lazy evaluation, can contribute significantly to modularity ... We conclude that since modularity is the key to successful programming, functional programming offers important advantages for software development."
Funciones casi puras
No hay side-effect
Fácil de componer y reutilizar
Fácil de razonar: Substitution Model
Refactor y Testing más simples
Lazy evaluation / Memoize
Concurrencia más simple
Descripción => Interpretación
Puntos interesantes:
Warning:
Side-Effect
Modificar algún estado externo de la unidad de ejecución
Cualquier operación de una función, que no sea trabajar con sus argumentos y devolver un resultado
Effect
Tipo de Dato con funcionalidad extra
Transparencia referencial
Programación funcional
... ¿Cómo generamos efectos en el "mundo real"???
¿Cómo nos conectamos a la Base?
¿Cómo consumimos un servicio?
¿Cómo programamos sin side-effect's?
Descripción
Interpretación
Operaciones como Valores:
Ejemplo: Conversor decimal a binario por consola
Descripción del programa:
Descripción
Interpretación
Un intérprete posible:
Otro intérprete:
Descripción
Interpretación
Ejecutando el programa:
Descripción
Interpretación
https://github.com/tpolecat/doobie
libraryDependencies ++= Seq(
"org.tpolecat" %% "doobie-core" % "0.5.0"
)
Programs as values: JDBC Programming with Doobie, by Rob Norris: https://www.youtube.com/watch?v=M5MF6M7FHPo
Transacciones
Logging de queries y tiempos
Queries dinámicas
YOLO mode
Documentación y soporte
Streaming
Mapping arduo para algunas queries
No soporta timeout por query
https://circe.github.io/circe
libraryDependencies ++= Seq( "io.circe" %% "circe-generic" % "0.8.0", "io.circe" %% "circe-java8" % "0.8.0", "io.circe" %% "circe-generic-extras" % "0.8.0"
)
Serialización / Deserialización de case classes trivial
Soporta encoders / decoders custom
Integración con Http4s
http://http4s.org
libraryDependencies ++= Seq(
"org.http4s" %% "http4s-blaze-server" % "0.18.0",
"org.http4s" %% "http4s-blaze-client" % "0.18.0",
"org.http4s" %% "http4s-circe" % "0.18.0",
"org.http4s" %% "http4s-dsl" % "0.18.0" )
/demo/employee/6
/demo/employee/filter/2015-01-01/2018-02-01?name=Pepe&minimum-age=25&offset=0
curl -v -X POST -H "Content-type: application/json" -d '{"name":"Juan","salary":12000}' 'http://localhost:9290/demo/company/hire/9'
Integración con circe
Middleware
Liviano
Streaming
Cookies