Functional Programming Made Easier
Functional Programming Made Easier
A Step-by-Step Guide
About the Book
Functional Programming is hard. Too hard. I struggled for years to learn a Functional Language with no definitive guide that takes you from knowing absolutely NOTHING to working as a Functional Programmer.
Functional Programming is clearly the future, which can be witnessed by looking at all the traditional languages slowly adopting Functional Features. But why compromise? Why not have all the power of a truly Functional Programming Language?
For most, moving from an Imperative Programming Language (Javascript, Python, C#, Java, etc.) to a Functional Programming Language (Haskell, PureScript, etc.) has been very difficult and requires years of effort.
Well, no more. Functional Programming Made Easier will start you at the very beginning with the basics. The book assumes that you know nothing about Functional Programming. It takes you one baby step at a time from concept to concept until you’re working at the level of today’s working Functional Programmers.
The book alternates between a Lecture Chapter, where a new concept is introduced and we code together, followed by a Lab Chapter, where you do all the coding using that new concept. But fear not. Unlike Math books you encountered in school, I will show you ALL of the answers. Not only that, but I will write the code ONE LINE AT A TIME with an explanation of my thinking every step of the way.
When mistakes were made in coding or design, I left them in the book. Anyone who has programmed knows all too well that you never code anything correctly the first time. Your experience with this book will simulate that as much as possible. We’ll find the mistakes, analyze where I went wrong (sometimes purposely), and fix them together.
I never just throw code your way. I will ask you to write some code and if you are struggling, I will sometimes give you hints so you can give it another try. In the end, we will always code the solution one line at a time allowing you to follow along if you get stuck or to simply check your solution against mine if you complete the exercise.
The first half of the book is where you’ll learn new concepts. The second half is where you can apply what you’ve learned to build small programs. The final few chapters are where you’ll build a Full-Stack web server and browser-based front end written in a Purely Functional Programming Language, PureScript.
PureScript is a modern Haskell-like Purely Functional Programming Language that compiles to Javascript making it the best Functional Programming Language for both the Browser and the Server (via Node). It’s so closely related to Haskell that all of the concepts you learn translate directly from PureScript to Haskell.
I’ve used this book over the past year to teach a team of developers who are all now building SaaS applications for customers in PureScript.
The book assumes you have no Mathematical experience and only a modicum of Programming experience.
Some of the subjects that are explained in detail are as follows:
- Pure Functions
- Immutability
- Higher-order Functions
- Currying
- Partial Application
- Recursion
- Tail Recursion
- Pattern Matching
- Types
Polymorphic
Monomorphic
Sum
Product
Typeclasses
- Multi-parametric Typeclasses
- Overlapping Instances
- Orphaned Instances
- Functional Dependencies
- Isomorphisms
- Homomorphisms
- Abstract Algebra
Magma
Semigroup
Monoid
Group
Abelian Group (aka Commutative Group)
Semiring
Ring and Commutative Ring
Euclidean Ring
- Folds
- Algebraic Data Types (ADT)
- Functors (Covariant, Contravariant, Invariant)
- Functors of Values vs Functions
- Bifunctors
- Profunctors
- Applicative Functors
- Traversables
- Foldables
- Applicative Parsers
- Monads
- Monadic Parsers
- Monad Stacks (aka Monad Transformers)
- Category Theory (superficially)
Definition
Hask Category
Functors
Applicative
Kleisli Category
Some of the skills it’ll teach you along the way are:
- Interpreting Compiler Errors
- Type Holes
- Effects (Synchronous and Asynchronous)
- AVars and Refs (Managed Global State)
- Data Bus
- Ajax
- JSON Decoding
- Foreign Function Interface (FFI)
From the exercises and final project you will learn:
- Hash Routing
- Static File Servers
- CORS
- Salt Hashing Passwords
Honestly, I did not want to write this book. I would’ve rather that someone else had written so I could have just read this one book when I was learning Functional Programming. My journey would have been so much easier. While Functional Programming will never be easy, with this book, it will be much easier.
ATTENTION: For those who live in countries where even the lowest price of this book is too expensive, e.g. because of currency exchange rates, please use the Email the Author link and let me know what you can afford to pay and I'll send you a coupon that will reduce the cost to that amount.
Table of Contents
- Introduction
- Learning Functional Programming is Hard.
- Learning Programming is Learning How to Think
- Learning Functional Programming is Learning to Think Differently
- Why Functional Programming?
- You Cannot Describe an Experience
- Barrier to Entry
- Costs of Ownership
- Case Study: Javascript
- Case Study: Elm
- Finding Developers
- Finding Jobs
- Who is This Book For?
- From A to Z
- A, B, X, Y, Z
- A, B, C
- X, Y, Z
- A to Z
- Why PureScript?
- What’s PureScript?
- Why not Haskell or Elm or …?
- Haskell
- Elm
- Some Other Functional Language
- Why PureScript?
- Four Part Harmony
- Beginner
- Intermediate
- Advanced
- Beyond
- Exercises
- So Many Pages
- I: Beginner
- 1. Discipline is Freedom
- 1.1. Global State
- 1.2. Mutable State
- 1.2.1. No Variables
- 1.2.2. No Loops
- 1.3. Purity
- 1.4. Optimization
- 1.4.1. Memoization
- 1.4.2. Compiler Optimization
- 1.5. Types
- 1.5.1. Signal to Noise
- 1.5.2. Perceived Limits
- 1.5.3. Cake and Eat It
- 1.5.4. Cutting Through the Noise
- 1.5.5. Static Type Costs and Benefits
- 1.6. Summary
- 2. The Power of Functions
- 2.1. Functions as Parameters
- 2.2. Functions as Return Values
- 2.3. Higher-order Functions
- 2.4. Composition
- 2.4.1. Point-free Notation
- 2.5. Currying
- 2.5.1. Partial Application
- 3. The Basics of PureScript
- 3.1. Types
- 3.1.1. Javascript Primitives
- Boolean Type
- Char Type
- String Type
- Number Type
- 3.1.2. PureScript Primitives
- Int Type
- Array Type
- Record Type
- Syntactical Oddity
- 3.1.3. User Types
- Type Alias
- Data Type
- Algebraic Data Types (ADTs)
- New Types
- 3.1.4. Common Library Types
VoidUnitMaybe- Either
- Maybe vs Either
- Tuple
- Either vs Tuple
- List
- 3.1.1. Javascript Primitives
- 3.2. Pattern Matching
- 3.2.1. Case Expression
- 3.2.2. String Patterns
- 3.2.3. Array Patterns
- 3.2.4. List Patterns
- 3.2.5. Array vs List
- 3.2.6. Record Patterns
- 3.3. Logical Control
- 3.3.1. If-Then-Else Expression
- 3.3.2. Case Expression
- 3.3.3. Pattern Matching
- 3.3.4. Guards
- 3.4. Lambda Functions
- 3.5. Wildcards
- 3.5.1. Case Expression
- 3.5.2. Operator Sections
- 3.5.3. Records
- 3.6. Bindings
- 3.6.1. Where
- 3.6.2. Let
- 3.7. Binary Operators
- 3.7.1. Associativity
- 3.7.2. Precedence
- 3.7.3. Fixity
- 3.8. Comments
- 3.9. Inferring Functionality from Type Signatures
- 3.10. Summary
- 3.1. Types
- 4. Installing PureScript
- 4.1. Compiler and Tools
- 4.1.1. Installing
Node- For
NodeAlready Installed - For
NodeNOT Installed
- For
- 4.1.2. Create Project
- Initialize Project for
npmandnpx - Future-proofing
- Install
purescriptandspagointo your Project - Initialize Project for
git(Optional)
- Initialize Project for
- 4.1.3. Initialize PureScript Project
- 4.1.4. A Second Project
- 4.1.1. Installing
- 4.2. Editor and Plugins
- 4.2.1. Install Extensions
- 4.2.2. Configure Extensions
- 4.2.3. Configure Editor
- 4.1. Compiler and Tools
- 5. Basic Coding in PureScript
- 5.1. Prelude
- 5.2. Exercise Program
- 5.3. Pursuit
- 5.4. Writing
flip- 5.4.1. Hint for
flip - 5.4.2. Code for
flip - 5.4.3. Alternative Coding for
flip
- 5.4.1. Hint for
- 5.5. Writing
const- 5.5.1. Hint for
const - 5.5.2. Code for
const
- 5.5.1. Hint for
- 5.6. The Apply Operator
($) - 5.7. Writing
apply- 5.7.1. Hint for
($) - 5.7.2. Code for
($)
- 5.7.1. Hint for
- 5.8. Writing the Apply Flipped Operator
(#)- 5.8.1. Code for
applyFlippedand(#)
- 5.8.1. Code for
- 5.9. Preparing to Write
Data.ListFunctions - 5.10. Why
Data.Listand notData.Array - 5.11. Writing
singleton- 5.11.1. Code for
singleton
- 5.11.1. Code for
- 5.12. Writing
null- 5.12.1. Code for
null
- 5.12.1. Code for
- 5.13. Writing
snoc- 5.13.1. Hint for
snoc - 5.13.2. Code for
snoc
- 5.13.1. Hint for
- 5.14. Writing
length- 5.14.1. Hint for
length - 5.14.2. Code for
length
- 5.14.1. Hint for
- 5.15. Tail Recursion
- 5.15.1. Observations regarding Tail Recursion
- 5.16. Writing
head- 5.16.1. Hint for
head - 5.16.2. Code for
head
- 5.16.1. Hint for
- 5.17. Writing
tail- 5.17.1. Hint for
tail - 5.17.2. Code for
tail
- 5.17.1. Hint for
- 5.18. Writing
last- 5.18.1. Hint for
last - 5.18.2. Code for
last
- 5.18.1. Hint for
- 5.19. Writing
init- 5.19.1. Hint for
init - 5.19.2. Code for
init
- 5.19.1. Hint for
- 5.20. Writing
uncons- 5.20.1. Code for
uncons
- 5.20.1. Code for
- 5.21. Writing
index- 5.21.1. Hint for
index - 5.21.2. Code for
index
- 5.21.1. Hint for
- 5.22. Writing
!!- 5.22.1. Hint for
!! - 5.22.2. Code for
!!
- 5.22.1. Hint for
- 5.23. Writing
findIndex- 5.23.1. Hint for
findIndex - 5.23.2. Code for
findIndex
- 5.23.1. Hint for
- 5.24. Writing
findLastIndex- 5.24.1. Hint for
findLastIndex - 5.24.2. Code for
findLastIndex
- 5.24.1. Hint for
- 5.25. Local Function Type Signatures
- 5.26. Writing
reverse- 5.26.1. Hints for
reverse - 5.26.2. Code for
reverse
- 5.26.1. Hints for
- 5.27. Writing
concat- 5.27.1. Hint for
concat - 5.27.2. Code for
concat
- 5.27.1. Hint for
- 5.28. Writing
filter- 5.28.1. Code for
filter - 5.28.2. Alternative Coding for
filter
- 5.28.1. Code for
- 5.29. Tail Recursive version of
filter - 5.30. Time vs Space
- 5.31. Writing
catMaybes- 5.31.1. Hint for
catMaybes - 5.31.2. Code for
catMaybes
- 5.31.1. Hint for
- 5.32. Writing
range- 5.32.1. Hint for
range - 5.32.2. Code for
range
- 5.32.1. Hint for
- 5.33. Optimizing
range - 5.34. Writing
take- 5.34.1. Hint for
take - 5.34.2. Code for
take
- 5.34.1. Hint for
- 5.35. Writing
drop- 5.35.1. Code for
drop
- 5.35.1. Code for
- 5.36. Writing
takeWhile- 5.36.1. Code for
takeWhile
- 5.36.1. Code for
- 5.37. Writing
dropWhile- 5.37.1. Code for
dropWhile
- 5.37.1. Code for
- 5.38. Writing
takeEnd- 5.38.1. Hint for
takeEnd
- 5.38.1. Hint for
- 5.39. Another Hint for
takeEnd- 5.39.1. Code for
takeEnd
- 5.39.1. Code for
- 5.40. Writing
dropEnd- 5.40.1. Code for
dropEnd
- 5.40.1. Code for
- 5.41. Writing
zip- 5.41.1. Code for
zip
- 5.41.1. Code for
- 5.42. Writing
unzip- 5.42.1. Code for
unzip
- 5.42.1. Code for
- 1. Discipline is Freedom
- II: Intermediate
- 6. Typeclasses
- 6.1. The Problem
- 6.2. The Solution
- 6.3. Constraints
- 6.4. Typeclass Requirement
- 6.5. Built-in Typeclasses
- 6.5.1. Eq Typeclass
- 6.5.2. Ord Typeclass
- 6.5.3. Show Typeclass
- 6.6. Derived Instances
- 6.7. Newtype Typeclass
- 6.8. Deriving Instances using
newtype - 6.9. Overlapping Instances
- 6.10. Orphaned Instances
- 6.11. Instance Dependencies
- 6.12. Multi-Parametric Typeclasses
- 6.13. Functional Dependency
- 7. Coding Typeclasses
- 7.1. Coding Preparation
- 7.2. Maybe Data Type
- 7.3. Code for
MaybeData Type - 7.4. Writing
EqforMaybe - 7.5. Code for
EqforMaybe - 7.6. Writing
OrdforMaybe - 7.7. Hint for
OrdforMaybe - 7.8. Code for
OrdforMaybe - 7.9. Writing
>= - 7.10. Hint for
>= - 7.11. Code for
>= - 7.12. Writing
ShowforMaybe - 7.13. Code for
ShowforMaybe - 7.14. Deriving
Eq,OrdandShowforMaybe - 7.15. Hint for Deriving
- 7.16. Hint for Deriving
Show - 7.17. Code for
Eq,OrdandShowforMaybe - 7.18. Deriving
Eq,OrdandShowforEither - 7.19. Writing
Eq,OrdandShowforEither - 7.20. Creating Our Own Typeclass
- 7.21. Hint for
ToCSV - 7.22. Code for
ToCSV - 7.23. Using
ToCSV - 7.24. Another Hint for
ToCSV - 7.25. Code for
ToCSV - 7.26. Testing
ToCSV - 7.27. Writing
FromCSV - 7.28. Code for
FromCSV - 7.29. Testing
FromCSV
- 8. Abstract Algebra
- 8.1. Binary Operators
- 8.1.1. Associative Property
- 8.1.2. Commutative Property
- 8.2. Closure
- 8.3. Magma
- 8.4. Semigroup
- 8.5. Semigroup Typeclass
- 8.6. Monoid
- 8.7. Monoid Typeclass
- 8.8. Monoids in Programming vs Math
- 8.9. Monoids in Programming
- 8.10. Groups
- 8.11. Group Typeclass
- 8.12. Modular Arithmetic and Groups
- 8.13. Abelian Group
- 8.14. Abelian Group Type Alias
- 8.15. Arithmetic Operators in PureScript
- 8.16. Semiring
- 8.17. Semiring Typeclass
- 8.18. Semiring for Functions
- 8.19. Semiring Laws for Functions
- 8.20. Ring
- 8.21. Ring Typeclass
- 8.22. Commutative Ring Typeclass
- 8.23. Euclidean Ring
- 8.24. Summary
- 8.1. Binary Operators
- 9. Coding Abstract Algebra
- 9.1. Writing
SemigroupTypeclass - 9.2. Hint for
SemigroupTypeclass - 9.3. Code for
SemigroupTypeclass - 9.4. Writing
MonoidTypeclass - 9.5. Code for
MonoidTypeclass - 9.6. Writing
SemigroupforAndBool - 9.7. Hint for
SemigroupforAndBool - 9.8. Code for
SemigroupforAndBool - 9.9. Writing
MonoidforAndBool - 9.10. Code for
MonoidforAndBool - 9.11. Verify Semigroup Laws for
AndBool - 9.12. Writing
verifyAndBoolSemigroup - 9.13. Verify Monoid Laws for
AndBool - 9.14. Writing
verifyAndBoolMonoid - 9.15. Writing
SemigroupandMonoidforOrBool - 9.16. Code for
SemigroupandMonoidforOrBool - 9.17. Verify Semigroup and Monoid Laws for
OrBool - 9.18. Code for Semigroup and Monoid Laws for
OrBool - 9.19. Writing
Mod4Data Type - 9.20. Code for
Mod4Data Type - 9.21. Writing
SemigroupforMod4 - 9.22. Hint for
SemigroupforMod4 - 9.23. Code for
SemigroupforMod4 - 9.24. Writing
MonoidforMod4 - 9.25. Code for
MonoidforMod4 - 9.26. Writing
GroupTypeclass - 9.27. Code for
GroupTypeclass - 9.28. Writing
GroupforMod4 - 9.29. Code for
GroupforMod4 - 9.30. Writing
EqandShowforMod4 - 9.31. Code for
EqandShowforMod4 - 9.32. Writing
verifyMod4SemigroupforMod4 - 9.33. Code for
verifyMod4SemigroupforMod4 - 9.34. Writing
verifyMod4MonoidforMod4 - 9.35. Code for
verifyMod4MonoidforMod4 - 9.36. Writing Semigroup for Maybe
- 9.37. Writing
SemigroupandMonoidforFirst - 9.38. Code for
SemigroupandMonoidforFirst - 9.39. Writing
SemigroupandMonoidforLast - 9.40. Code for
SemigroupandMonoidforFirst
- 9.1. Writing
- 10. Folds
- 10.1. Fold by other Names
- 10.2. Foldable Typeclass
- 10.3. Fold Associativity
- 10.4. Foldable for
List - 10.5. Rewriting
lengthwith Folds
- 11. Coding Folds
- 11.1. Writing
reverse - 11.2. Code for
reverse - 11.3. Writing
max - 11.4. Hint for
max - 11.5. Code for
max - 11.6. Writing
findMax - 11.7. Code for
findMax - 11.8. Improving
findMax - 11.9. Improved
findMax - 11.10. Code for
findMaxusing Fold - 11.11. Code for
findMaxusingNonEmptyList - 11.12. Postmortem of
findMaxandfindMaxNE - 11.13. Writing
findMaxNEusingfoldl1 - 11.14. Code for
findMaxNEusingfoldl1 - 11.15. Writing
foldl1 - 11.16. Hint for
foldl1 - 11.17. Code for
foldl1 - 11.18. Writing
sum - 11.19. Code for
sumas a Recursive Function - 11.20. Code for
sumas Tail Recursive - 11.21. Code for
sumusingfoldl - 11.22. Hint for
sumforIntsandNumbers - 11.23. Code for
sumforIntsandNumbers - 11.24. Code for
sumusingFoldable - 11.25. Using
sumwithTree - 11.26. Hint for
FoldableforTree - 11.27. Code for
toListInstance forTree - 11.28. Code for
FoldableforTree - 11.29. Improving on
FoldableforTree
- 11.1. Writing
- 12. Functors
- 12.1. Defining ADTs
- 12.2. Semantics
- 12.2.1. Name
- 12.2.2. Implicit Behavior
- 12.2.3. Explicit Behavior
- 12.3. Contexts
- 12.4. Higher-kinded Types
- 12.5. Functions with Simple Types
- 12.6. Functors to the Rescue
- 12.7. Two Perspectives of
map - 12.8. The Power of Abstractions
- 12.9. A Little Category Theory
- 12.10. Concrete Examples in
Hask - 12.11. Functors in Category Theory
- 12.12. Functor Laws
- 12.13. Verifying the Functor Laws for
Maybe - 12.14. Functor Instance for
Either - 12.15. Functor Instance for
Choice - 12.16. Bifunctor Typeclass
- 12.17. Bifunctors in Category Theory
- 12.18. Bifunctor Laws
- 12.19. Functors in Perspective
- 13. Coding Functors
- 13.1. Writing Functor Instance for
Maybe - 13.2. Code for Functor Instance of
Maybe - 13.3. Writing Functor Instance for
Either - 13.4. Code for Functor Instance of
Either - 13.5. Writing Functor Instance for
Tuple - 13.6. Code for Functor Instance of
Tuple - 13.7. Writing Functor Instance for
Threeple - 13.8. Writing Functor Instance for
Threeple - 13.9. Validating the Functor Laws
- 13.10. Writing Bifunctor Instance for
Either - 13.11. Code for Bifunctor Instance for
Either - 13.12. Writing Bifunctor Instance for
Tuple - 13.13. Code for Bifunctor Instance for
Tuple - 13.14. Writing Bifunctor Instance for
Threeple - 13.15. Code for Bifunctor Instance for
Threeple - 13.16. Validating the Bifunctor Laws
- 13.1. Writing Functor Instance for
- 14. More Functors
- 14.1. Functors of Values
- 14.2. Functors of Functions
- 14.3. Contravariant Functor
- 14.4. Contravariant Laws
- 14.5. Contravariant in Category Theory
- 14.6. Choosing
FunctororContravariant - 14.7. Polarity
- 14.8. Invariant Functor
- 14.9. Invariant Laws
- 14.10. Homomorphisms
- 14.11. Natural Transformations
- 14.12. Monoid Homomorphisms
- 14.13. Isomorphisms
- 14.14. Functor Instances for Function
- 14.15. Profunctor
- 14.16. Profunctor Laws
- 14.17. Profunctor and Isomorphisms
- 14.18. Profunctor Perspective
- 14.19. Functor Summary
- 14.20. Functor Intuition
- 15. Coding More Functors
- 15.1. Writing the Predicate
odd - 15.2. Code for the Predicate
odd - 15.3. Writing a
PredicateType - 15.4. Code for a
PredicateType - 15.5. Code for
runPredicate - 15.6. Writing
ContravariantInstance forPredicate - 15.7. Code for
ContravariantInstance forPredicate - 15.8. Folds and Moore Machines
- 15.9. Hint for
ProfunctorforMoore - 15.10. Code for
ProfunctorforMoore - 15.11. Modeling Folds with Moore Machines
- 15.12. Writing a Moore Machine that Folds
- 15.13. Code for
addr - 15.14. Code for a general
addr - 15.15. Writing
runFoldL - 15.16. Code for
runFoldL - 15.17. Leveraging
Moore’sProfunctorInstance - 15.18. Hint for
sizer - 15.19. Code for
sizer - 15.20. Power of the Functor
- 15.1. Writing the Predicate
- 6. Typeclasses
- III: Advanced
- 16. Applicative Functors, Traversables and Alternatives
- 16.1. Applicative in Haskell
- 16.2. Applicative Functors in Category Theory
- 16.3. Apply Laws
- 16.4. Applicative Laws
- 16.5. Applicative Instance for
Maybe - 16.6. Applicative Instance for Product Types
- 16.7. Applicative Instance for Sum Types
- 16.8. An Applicative Example
- 16.9. Applicative Effects
- 16.10. Functors vs Applicatives with Effects
- 16.11. Examples of Applicative Effects
- 16.12. Applicative Effects and Commutativity
- 16.13. Traversables
- 16.14. Traversable for
List - 16.15. A Few Words on Context
- 16.16. Alt
- 16.17. Alt Laws
- 16.18. Plus
- 16.19. Plus Laws
- 16.20. Alternative Functor
- 17. Coding Applicatives
- 17.1. Writing
ApplicativeInstance forMaybe - 17.2. Code for
ApplicativeInstance forMaybe - 17.3. Writing
ApplicativeInstance forEither - 17.4. Code for
ApplicativeInstance forEither - 17.5. Validation
- 17.6. Using Validation
- 17.7. Applicative Parsers
- 17.8. Parsers in General
- 17.9. Writing an Applicative Parser
- 17.10. Looking Deeper at our Parser
- 17.11. A Common Pattern with Our Parser
- 17.12. Using Our Parser
- 17.1. Writing
- 18. Monads
- 18.1. Side-effects
- 18.1.1. Composing Side-effect Functions
- 18.1.2. Composing Side-effect Function with Pure Ones
- 18.1.3. Function Application with Side-effect Functions
- 18.2.
DebuggableType - 18.3. Generalizing
Debuggable - 18.4. We Created a
Monadand More - 18.5. An Alternative
MonadImplementation - 18.6. Back to PureScript’s
MonadImplementation - 18.7. Recap
Bind,Monadand Supporting Functions - 18.8. Haskell’s Monad Implementation
- 18.9. Monad Laws
- 18.10. Monad Instance for
Maybe - 18.11. Working with
MaybeMonad - 18.12. Do Notation
- 18.13. Cheating with the
ApplicativeInstance andap - 18.14. Monad Instance for
Either - 18.15. Working with
EitherMonad - 18.16. Adding
MonadInstance forValidation - 18.17.
WriterMonad - 18.18.
WriterHelper Functions - 18.19. Parallel Computations
- 18.20.
ReaderMonad - 18.21.
StateMonad - 18.22. Using
Stateas a MonadicValidation - 18.23. The Kleisli Category
- 18.1. Side-effects
- 19. Coding Monads
- 19.1. Writing
MonadInstance forMaybe - 19.2. Code for
MonadInstance forMaybe - 19.3. Writing
MonadInstance forEither - 19.4. Code for
MonadInstance forEither - 19.5. Monadic Parsers
- 19.6. Coding with Monadic Parsers
- 19.7. Writing a Date Parser
- 19.8. How Does
ParserActually Work - 19.9.
someandmanyCombinators - 19.10. Using
someandmany - 19.11. The
RWSMonad
- 19.1. Writing
- 20. Monad Stacks
- 20.1. Reducing the need for
lift - 20.2. Monad Transformers and their APIs
- 20.3. The Error Monad Transformer,
ExceptT - 20.4. Monad Stack Order
- 20.5. Coding with Monad Transformers
- 20.6. Coding with
Effectat the Base - 20.7. Coding
WriterT - 20.8. Coding
ReaderT - 20.9. Making
ReaderTEasier to Use - 20.10. The Power of the Combinator
- 20.1. Reducing the need for
- 21. Coding Monad Transformers
- 21.1. Writing the
StateTMonad Transformer - 21.2. Type Holes and Undefined
- 21.3. Back to Writing the
StateTMonad Transformer - 21.4. Testing our StateT Implementation
- 21.5. Problems with using StateT with ExceptT
- 21.6. Guidelines for Using
ExceptT
- 21.1. Writing the
- 16. Applicative Functors, Traversables and Alternatives
- IV: Beyond
- 22. Synchronous and Asynchronous Effects
- 22.1. Working with the
EffectMonad - 22.2. Working with the
AffMonad- 22.2.1. Fibers
- 22.2.2. Cancelers
- 22.2.3. AVars
- 22.2.4. Busses
- 22.1. Working with the
- 23. Coding With Effects
- 23.1. Simple AVar Program Specification
- 23.2. Effects Program Specifications
- 23.2.1. Creating a Random Number
- 23.2.2. Making a Monad Stack
- 23.2.3. Creating a
Fiber - 23.2.4. Running a Monad Stack in a
Fiber - 23.2.5. Making a
Bus - 23.2.6. Publish to a
Bus - 23.2.7. Subscribing to a
Bus
- 23.3. Coding our Effects Program
- 23.4. Javascript Runtime with AVars and Busses
- 24. JSON and Ajax
- 24.1. Generic JSON Encoding and Decoding
- 24.1.1.
ForeignModule - 24.1.2.
Foreign.GenericModule - 24.1.3.
Foreign.Generic.ClassModule
- 24.1.1.
- 24.2.
ArgonautJSON Encoding and Decoding - 24.3. Ajax
- 24.3.1. GET Request
- 24.3.2. POST Request
- 24.1. Generic JSON Encoding and Decoding
- 25. Coding With Ajax and JSON
- 25.1. Ajax Program Specifications
- 25.2. Coding Ajax and JSON with Foreign
- 25.2.1. Encoding and Sending to the Echo Server
- 25.2.2. Decoding the Response Modeled with Reversed Names
- 25.2.3. Decoding the Response Using
Argonaut - 25.2.4. Serial and Parallel
Aff - 25.2.5. Using Parallel with Ajax
- 26. Foreign Function Interface (FFI)
- 26.1. FFIs That Return PureScript Types
- 26.2. FFIs and
Effect - 26.3. FFIs and
Aff
- 27. Coding With FFIs
- 27.1. Wrapping an NPM library
- 27.2. Reversing JSON Keys in Javascript
- 28. Writing a Backend using HTTPure
- 28.1. A Brief Primer on
HTTPure- 28.1.1. Creating an HTTP Server
- 28.2. Routers
- 28.3. API For a Front-end Application
- 28.4. Modeling the API
- 28.5. Coding the Server’s Infrastructure
- 28.6. Coding the Account Handler
- 28.6.1. Coding
loadAccounts - 28.6.2. Coding
createAccount
- 28.6.1. Coding
- 28.7. Coding the Account Manager
- 28.7.1. Code for Password Hash
- 28.7.2. Coding
startupandshutdownfor Account Manager - 28.7.3. Coding
verifyLogon - 28.7.4. Finishing the
logonRequest - 28.7.5. Fleshing out
router
- 28.8. Coding the Session Manager
- 28.8.1. Code for
startup,shutdownandverifySession
- 28.8.1. Code for
- 28.9. Server Logging
- 28.10. Coding the API
- 28.10.1. Coding
LogoffRequestAPI Handler - 28.10.2. Coding
CreateUserRequestAPI Handler - 28.10.3. Improving Our Parser
- 28.10.4. Coding
QueryUsersAPI Handler
- 28.10.1. Coding
- 28.11. Servers in PureScript
- 28.1. A Brief Primer on
- 29. Building Front-ends using Halogen
- 29.1. Halogen Component Overview
- 29.1.1. State
- 29.1.2. Actions
- 29.1.3. Queries
- 29.1.4. Inputs
- 29.1.5. Outputs
- 29.1.6. Emitters
- 29.1.7. Lifecycle
- 29.1.8. Slots
- 29.1.9. Halogen Model
- 29.2. Halogen Example Application
- 29.2.1. Creating New Project
- 29.2.2. Writing a Counter Component
- 29.2.3. Rendering the Counter Component
- 29.2.4. Counter Component Query Algebra
- 29.2.5. Counter Component as a Child Component
- 29.2.6. Emitters
- 29.1. Halogen Component Overview
- 30. Writing a Front End using Halogen
- 30.1. Halogen CSS Library Setup
- 30.2. Hash Routing
- 30.2.1. Defining Routes
- 30.3. Application Monad
- 30.4. Capabilities
- 30.5. Capability Implementations
- 30.6. Router Component
- 30.7. Page Component
- 30.8. Logon Page
- 30.9. Calling the Backend
- 30.9.1. CORS Solution
- 30.9.2. Static File Server Solution
- 30.10. ChangePassword Page
- 30.11. Users Page
- 30.12. Modal Dialog Component
- 30.13. Message Modal Component
- 30.14. Customizing the Modal Dialog Component
- 30.15. Create Users Modal Component
- 30.16. Logoff Page
- Appendix A: Epilogue
- 22. Synchronous and Asynchronous Effects
The Leanpub 60 Day 100% Happiness Guarantee
Within 60 days of purchase you can get a 100% refund on any Leanpub purchase, in two clicks.
Now, this is technically risky for us, since you'll have the book or course files either way. But we're so confident in our products and services, and in our authors and readers, that we're happy to offer a full money back guarantee for everything we sell.
You can only find out how good something is by trying it, and because of our 100% money back guarantee there's literally no risk to do so!
So, there's no reason not to click the Add to Cart button, is there?
See full terms...
Earn $8 on a $10 Purchase, and $16 on a $20 Purchase
We pay 80% royalties on purchases of $7.99 or more, and 80% royalties minus a 50 cent flat fee on purchases between $0.99 and $7.98. You earn $8 on a $10 sale, and $16 on a $20 sale. So, if we sell 5000 non-refunded copies of your book for $20, you'll earn $80,000.
(Yes, some authors have already earned much more than that on Leanpub.)
In fact, authors have earnedover $14 millionwriting, publishing and selling on Leanpub.
Learn more about writing on Leanpub
Free Updates. DRM Free.
If you buy a Leanpub book, you get free updates for as long as the author updates the book! Many authors use Leanpub to publish their books in-progress, while they are writing them. All readers get free updates, regardless of when they bought the book or how much they paid (including free).
Most Leanpub books are available in PDF (for computers) and EPUB (for phones, tablets and Kindle). The formats that a book includes are shown at the top right corner of this page.
Finally, Leanpub books don't have any DRM copy-protection nonsense, so you can easily read them on any supported device.
Learn more about Leanpub's ebook formats and where to read them