We have covered the basics and monads. There’s a lot more to functional programming and Haskell!
newtype StateT s m a =
StateT { runStateT :: s -> m (a, s) }
type State s a = StateT s Identity a
type Parser a = StateT String [] a
type NState s a = StateT s [] a
type NState01 s a = StateT (s, StdGen) Maybe a
Overview of Monoids, Foldable, and Traversable
newtype State s a = { runState :: s -> (a, s ) }
newtype Reader env a = { runReader :: env -> a }
newtype Writer log a = { runWriter :: (a, log) }
State s a
values produce an a
… while also reading and “updating
mutable state” of type s
.
Reader env a
values produce an a
… while
also accessing some (read-only)
env
ironment.
Writer log a
values produce an a
… plus a
“log
” (often a String
or list but in general
any Monoid
).
Laziness and Seq
Mutable State (if you’re “overly attached” or actually require it)
Lens: Lenses, Folds, and Traversals
Generalized Algebraic Datatypes (GADTs)
QuickCheck: Randomized Property-Based Testing
…
🎆 Fireworks, courtesy of Logan Quick! 🎆