# Agenda ### Introduction * Historical overview * Imperative and decalarative programming * Complexity * The perils of mutable state * Static and dynamic typing * Abstraction * Data representation * Composition ### Functions * Relations vs. functions * Introduction to Lambda calculus * Binding and environments * Pure functions: Expressions and statements * Referential transparency * Composition * Higher-order functions * Currying and partial application * Recursion and tail call optimization ### Introduction to F\# on .NET Core * Order of declarations and files * Mutual recursion: types, functions and modules * Pattern matching * Active patterns * Mutable variables ### Types and type systems * Introduction to types * Type systems and type checking * Type inference * The Curry-Howard isomorphism * Existence as proof * Algebraic data types * OOP features ### Patterns and abstraction * Functors * Applicative functors * Monads * Optics ### Generic programming in F\# * Types, classes and members * Interfaces * Constraints ### Designing with types * Stating intent * Domain modeling * Algebraic types as conjunction and disjunction * Making invalid state unrepresentable ### Domain Specific Languages * Combinators * HTML combinators ### Reactive programming * Fable React * Fable Elmish