F# for Fun and Profit
This site shows you ways that F# can help in day-to-day development of mainstream commercial business software
- Posts
- 202 from 1 Jan 2001 to 28 Dec 2025
- Posting
- now and then (2 in the last year)
- Kind
- personal blog
- Feed
- https://fsharpforfunandprofit.com/index.xml
2025 2
2021 5
2020 25
- Revisiting the six approaches
- Dependency Interpretation
- Dependency injection using the Reader monad
- Dependency injection using parameters
- Six approaches to dependency injection
- Low-risk ways to use F# at work
- Recursive types and folds
- The 'Annotated walkthroughs' series
- The 'Computation Expressions' series
- The 'dependency cycle' series
- The 'designing with types' series
- The 'expressions and syntax' series
- The 'functional approach to authorization' series
- The 'Handling State' series
- The 'object-oriented programming in F#' series
- The 'Optimization' series
- The 'porting from C#' series
- The 'Property Based Testing' series
- The 'recipe for a functional app' series
- The 'thinking functionally' series
- The 'Understanding F# types' series
- The 'Understanding monoids' series
- The 'Why use F#' series
- Understanding Map and Apply and Bind
- Understanding Parser Combinators
2019 1
2018 1
2017 1
2016 2
2015 36
- Thirteen ways of looking at a turtle - addendum
- Thirteen ways of looking at a turtle (part 2)
- Thirteen ways of looking at a turtle
- Writing a JSON parser from scratch
- Improving the parser library
- Building a useful set of parser combinators
- Understanding Parser Combinators
- Trees in the real world
- Generic recursive types
- Understanding Folds
- Introducing Folds
- Catamorphism examples
- Introduction to recursive types
- Choosing between collection functions
- Algebraic type sizes and domain modelling
- Map and Bind and Apply, a summary
- Reinventing the Reader monad
- Using map, apply, bind and sequence in practice
- Understanding traverse and sequence
- Using the core functions in practice
- Understanding bind
- Understanding map and apply
- Swapping type-safety for high performance using compiler directives
- Introvert and extrovert programming languages
- F# decompiled into C#
- Refactoring the Monadster
- Completing the body of the Monadster
- Dr Frankenfunctor and the Monadster
- We don't need no stinking UML diagrams
- Happy F# Day!
- Enterprise Tic-Tac-Toe, part 2
- Enterprise Tic-Tac-Toe
- Is your programming language unreasonable?
- Using types as access tokens
- Constraining capabilities based on identity and role
- A functional approach to authorization
2014 17
- Choosing properties in practice, part 3
- Choosing properties in practice, part 2
- Choosing properties in practice, part 1
- Choosing properties for property-based testing
- Understanding FsCheck
- The Enterprise Developer from Hell
- Calculator Walkthrough: Part 4
- Calculator Walkthrough: Part 3
- Calculator Walkthrough: Part 2
- Calculator Walkthrough: Part 1
- Other interesting ways of using F# at work
- Using F# for database related tasks
- Using F# for testing
- Using F# for development and devops scripts
- Twenty six low-risk ways to use F# at work
- Analysis of Roslyn vs. the F# compiler
- Commentary on 'Roman Numerals Kata with Commentary'
2013 31
- Working with non-monoids
- Monoids in practice
- Monoids without tears
- Railway oriented programming: Carbonated edition
- Cycles and modularity in the wild
- Cyclic dependencies are evil
- Refactoring to remove cyclic dependencies
- Organizing modules in a project
- Why I won't be writing a monad tutorial
- Railway oriented programming
- How to design and code a complete program
- Ten reasons not to use a statically typed functional programming language
- Implementing a CE: The rest of the standard methods
- Implementing a CE: Adding laziness
- Implementing a CE: Overloading
- Implementing a CE: Delay and Run
- Implementing a CE: Combine
- Implementing a CE: Zero and Yield
- More on wrapper types
- Computation expressions and wrapper types
- Introducing 'bind'
- Understanding continuations
- Computation expressions: Introduction
- Designing with types: Conclusion
- Designing with types: Non-string types
- Designing with types: Constrained strings
- Designing with types: Making state explicit
- Designing with types: Discovering new concepts
- Designing with types: Making illegal states unrepresentable
- Designing with types: Single case union types
- Designing with types: Introduction
2012 72
- Getting started with direct porting
- Porting from C# to F#: Introduction
- Object expressions
- Interfaces
- Inheritance and abstract classes
- Classes
- Object-oriented programming in F#: Introduction
- Formatted text using printf
- Built-in .NET types
- Units of measure
- Enum types
- Understanding type inference
- Worked example: A stack based calculator
- Worked example: Roman numerals
- Worked example: Parsing command line arguments
- Match expressions
- The Option type
- Discriminated Unions
- Records
- Tuples
- Type abbreviations
- Overview of types in F#
- Understanding F# types: Introduction
- Exceptions
- Control flow expressions
- Parameter and value naming conventions
- F# syntax: indentation and verbosity
- Binding with let, use, and do
- Overview of F# expressions
- Expressions vs. statements
- Expressions and syntax: Introduction
- Attaching functions to types
- Organizing functions
- Function signatures
- Defining functions
- Function associativity and composition
- Partial application
- Currying
- How types work with functions
- Function Values and Simple Values
- Mathematical functions
- Thinking Functionally: Introduction
- Why use F#: Conclusion
- Anything C# can do...
- Seamless interoperation with .NET libraries
- Completeness
- Functional Reactive Programming
- Messages and Agents
- Asynchronous programming
- Concurrency
- Worked example: Designing for correctness
- Using the type system to ensure correct code
- Exhaustive pattern matching
- Immutability
- Correctness
- Active patterns
- Partial Application
- Functions as interfaces
- Out-of-the-box behavior for types
- Convenience
- Pattern matching for conciseness
- Using functions as building blocks
- Using functions to extract boilerplate code
- Low overhead type definitions
- Type inference
- Conciseness
- Four Key Concepts
- Comparing F# with C#: Downloading a web page
- Comparing F# with C#: Sorting
- Comparing F# with C#: A simple sum
- F# syntax in 60 seconds
- Introduction to the 'Why use F#' series