Chapter 2: Your First F# Program – Getting Started With F#
Creating Your First F# Program
Using Properties and the Dot-Notation
Using Object-Oriented Libraries from F#
Using open to Access Namespaces and Modules
Using new and Setting Properties
Chapter 3: Introducing Functional Programming
Starting with Numbers and Strings
Some Simple Types and Literals
Working with Conditionals: && and ||
Getting Started with Pattern Matching
Guarding Rules and Combining Patterns
Further Ways of Forming Patterns
Using Anonymous Function Values
Computing with Aggregate Operators
Building Functions with Partial Application
Iterating with Aggregate Operators
Abstracting Control with Functions
Using Object Methods as First-Class Functions
Some Common Uses of Function Values
Chapter 4: Introducing Imperative Programming
About Functional and Imperative Programming
Imperative Looping and Iterating
More Iteration Loops over Sequences
Introducing the Imperative .NET Collections
Using Dictionary’s TryGetValue
Using Dictionaries with Compound Keys
Some Other Mutable Data Structures
Exceptions and Controlling Them
Combining Functional and Imperative: Efficient Precomputation and Caching
Precomputation and Partial Application
Other Variations on Caching and Memoization
Combining Functional and Imperative: Functional Programming with Side Effects
Consider Replacing Mutable Locals and Loops with Recursion
Separating Pure Computation from Side-Effecting Computations
Separating Mutable Data Structures
Not All Side Effects Are Equal
Avoid Combining Imperative Programming and Laziness
Chapter 5: Understanding Types in Functional Programming
Exploring Some Simple Type Definitions
Handling Non-Unique Record Field Names
Using Discriminated Unions as Records
Defining Multiple Types Simultaneously
Some Important Generic Functions
Generic Algorithms through Explicit Arguments
Generic Algorithms through Function Parameters
Generic Algorithms through Inlining
More on Different Kinds of Types
Reference Types and Value Types
Performing Type Tests via Pattern Matching
Knowing When Upcasts Are Applied Automatically
Troubleshooting Type-Inference Problems
Using a Visual Editing Environment
Understanding the Value Restriction
Working Around the Value Restriction
Understanding Generic Overloaded Operators
Chapter 6: Programming with Objects
Getting Started with Objects and Members
Adding Further Object Notation to Your Types
Working with Indexer Properties
Using Named and Optional Arguments
Defining Object Types with Mutable State
Using Optional Property Settings
Getting Started with Object Interface Types
Defining New Object Interface Types
Implementing Object Interface Types Using Object Expressions
Implementing Object Interface Types Using Concrete Types
Using Common Object Interface Types from the .NET Libraries
Understanding Hierarchies of Object Interface Types
More Techniques to Implement Objects
Combining Object Expressions and Function Parameters
Defining Partially Implemented Class Types
Using Partially Implemented Types via Delegation
Using Partially Implemented Types via Implementation Inheritance
Combining Functional and Objects: Cleaning Up Resources
Managing Resources with More Complex Lifetimes
Extending Existing Types and Modules
Working with F# Objects and .NET Types
Chapter 7: Encapsulating and Organizing Your Code
Hiding Things with Local Definitions
Hiding Things with Accessibility Annotations
Organizing Code with Namespaces and Modules
Putting Your Modules and Types in Namespaces
When Are Signature Types Checked?
Defining a Module with the Same Name as a Type
Preventing Client Code from Opening a Module
Using Files as Small Reusable Components
Creating Assemblies, DLLs, and EXEs
Chapter 8: Working with Textual Data
Building Strings and Formatting Data
Formatting Strings Using .NET Formatting
Parsing Strings and Textual Data
Using Regular Expressions to Parse Lines
More on Matching with System.Text.RegularExpressions
Encoding and Decoding Unicode Strings
Encoding and Decoding Binary Data
Using XML as a Concrete Language Format
Using the System.Xml Namespace
From Concrete XML to Abstract Syntax
Some Recursive Descent Parsing
Chapter 9: Working with Sequences and Structured Data
Getting Started with Sequences
Transforming Sequences with Aggregate Operators
Which Types Can Be Used as Sequences?
Using Lazy Sequences from External Sources
Enriching Sequence Expressions with Additional Logic
Generating Lists and Arrays Using Sequence Expressions
More on Working with Sequences
Using Other Sequence Operators: Truncate and Sort
Selecting Multiple Elements From Sequences
Finding Elements and Indexes in Sequences
Grouping and Indexing Sequences
Cleaning Up in Sequence Expressions
Expressing Some Operations Using Sequence Expressions
Structure Beyond Sequences: Working with Trees
Example: Abstract Syntax Representations
Transforming Abstract Syntax Representations
Using On-Demand Computation with Abstract Syntax Trees
Caching Properties in Abstract Syntax Trees
Memoizing Construction of Syntax Tree Nodes
Active Patterns: Views for Structured Data
Converting the Same Data to Many Views
Defining Partial and Parameterized Active Patterns
Hiding Abstract Syntax Implementations with Active Patterns
Equality, Hashing, and Comparison for New Structured Data Types
Equality, Hashing, and Comparison
Asserting Equality, Hashing, and Comparison Using Attributes
Fully Customizing Equality, Hashing, and Comparison on a Type
Suppressing Equality, Hashing, and Comparison on a Type
Customizing Generic Collection Types
Tail Calls and Recursive Programming
Tail Recursion and List Processing
Tail Recursion and Object-Oriented Programming
Tail Recursion and Processing Unbalanced Trees
Using Continuations to Avoid Stack Overflows
Another Example: Processing Syntax Trees
Chapter 10: Numeric Programming and Charting
Basic Charting with FSharpChart
Basic Numeric Types and Literals
Sequences, Statistics and Numeric Code
Summing, Averaging, Maximizing and Minimizing Sequences
Statistics, Linear Algebra and Distributions with Math.NET
Basic Statistical Functions in Math.NET Numerics
Using Histograms and Distributions from Math.NET Numerics
Using Matrices and Vectors from Math.NET
Matrix Inverses, Decompositions and Eigenvalues
Adding Units to a Numeric Algorithms
Adding Units to a Type Definition
Some Limitations of Units of Measure
Chapter 11: Reactive, Asynchronous, and Parallel Programming
Creating and Publishing Events
Using and Designing Background Workers
Building a Simpler Iterative Worker
Raising Additional Events from Background Workers
Connecting a Background Worker to a GUI
Introducing Asynchronous and Parallel Computations
Fetching Multiple Web Pages in Parallel, Asynchronously
Under the Hood: What Are Asynchronous Computations?
Parallel File Processing Using Asynchronous Workflows
Running Asynchronous Computations
Common I/O Operations in Asynchronous Workflows
Using Tasks with Asynchronous Programming
Understanding Exceptions and Cancellation
Under the Hood: Implementing Async.Parallel
Using async for CPU Parallelism with Fixed Tasks
Creating Objects That React to Messages
Scanning Mailboxes for Relevant Messages
Example: Asynchronous Web Crawling
Using Shared-Memory Concurrency
Shared Memory, Race Conditions, and the .NET Memory Model
Using Locks to Avoid Race Conditions
Some Other Concurrency Primitives
Chapter 12: Symbolic Programming with Structured Data
Verifying Circuits with Propositional Logic
Representing Propositional Logic
Evaluating Propositional Logic Naively
From Circuits to Propositional Logic
Checking Simple Properties of Circuits
Representing Propositional Formulae Efficiently Using BDDs
Circuit Verification with BDDs
Symbolic Differentiation and Expression Rendering
Modeling Simple Algebraic Expressions
Implementing Local Simplifications
A Richer Language of Algebraic Expressions
Simplifying Algebraic Expressions
Symbolic Differentiation of Algebraic Expressions
Chapter 13: Integrating External Data and Services
Getting Started with Type Providers and Queries
Example - Language Integrated OData
Example - Language Integrated SQL
More on Relational Databases and ADO.NET
Establishing Connections using ADO.NET
Creating a Database using ADO.NET
Using Stored Procedures via ADO.NET
Chapter 14: Building Smart Web Applications
Serving Web Content the Simple Way
Building Ajax Rich Client Applications
Learning More from the WebSharper Documentation
Getting Started with WebSharper
Calling Server Code from the Client
Serving Content from WebSharper Sitelets
Embedding Client-Side Controls in Sitelet Pages
Constructing and Combining Sitelets
Sitelet Routers and Controllers
Constructing Sitelets for Handling Non-GET HTTP Commands
Dependent Formlets and Flowlets
Automated Resource Tracking and Handling
Using Third-Party JavaScript Libraries
Chapter 15: Building Mobile Web Applications
Web-based vs. Native Mobile Applications
Feature Detection and Polyfilling in WebSharper
Mobile Capabilities, Touch Events, and Mobile Frameworks
Building a Mobile Web Application for iOS Devices
Developing Social Networking Applications
Configuring Your New Facebook Application
Defining the Main HTML Application
Developing Android Applications with WebSharper
Setting Up and Testing with Your Android Environment
Using the Android Application Visual Studio Template
Implementing Your Native Android Application
Chapter 16: Visualization and Graphical User Interfaces
Writing “Hello, World!” in a Click
Understanding the Anatomy of a Graphical Application
Displaying Samples from Sensors
Building the GraphControl: The Model
Building the GraphControl: Style Properties and Controller
Building the GraphControl: The View
Creating the Visualization Application
Creating the Application Plumbing
Windows Presentation Foundation
Chapter 17: Language-Oriented Programming: Advanced Techniques
An Example: Success/Failure Workflows
Workflows and Untamed Side Effects
Computation Expressions with Custom Query Operators
Example: Probabilistic Workflows
Combining Workflows and Resources
Recursive Workflow Expressions
Schema Compilation by Reflecting on Types
Using the F# Dynamic Reflection Operators
Example: Using F# Quotations for Error Estimation
Resolving Reflected Definitions
Chapter 18: Libraries and Interoperating with Other Languages
Types, memory and interoperability
Libraries: A High-Level Overview
Namespaces from the .NET Framework
Namespaces from the F# Libraries
Using Further F# and .NET Data Structures
System.Collections.Generic and Other .NET Collections
Supervising and Isolating Execution
Further Libraries for Reflective Techniques
Using Microsoft.FSharp.Reflection
Some Other .NET Types You May Encounter
Under the Hood: Interoperating with C# and other .NET Languages
Calling COM Components from F#
Interoperating with C and C++ with PInvoke
Mapping C Data Structures to F# Code
Marshalling Parameters to and from C
Marshalling Strings to and from C
Passing Function Pointers to C
Wrapper Generation and Limits of PInvoke
Chapter 19: Packaging, Debugging and Testing F# Code
Mixing Scripting and Compiled Code
Choosing Optimization Settings
Packaging Different Kinds of Code
Using Data and Configuration Settings
Using More Features of the Visual Studio Debugger
Instrumenting Your Program with the System.Diagnostics Namespace
Debugging Concurrent and Graphical Applications
Debugging and Testing with F# Interactive
Some Common F# Interactive Directives
Understanding How F# Interactive Compiles Code
F# Interactive and Visual Studio
Chapter 20: Designing F# Libraries
Designing Vanilla .NET Libraries
Understanding Functional Design Methodology
Understanding Where Functional Programming Comes From
Understanding Functional Design Methodology
Applying the .NET Library Design Guidelines to F#
Recommendation: Use the .NET Naming and Capitalization Conventions Where Possible
Recommendation: Avoid Using Underscores in Names
Recommendation: Follow the .NET Guidelines for Exceptions
Recommendation: Consider Using Option Values for Return Types Instead of Raising Exceptions
Recommendation: Follow the .NET Guidelines for Value Types
Recommendation: Consider Using Explicit Signature Files for Your Framework
Recommendation: Consider Avoiding the Use of Implementation Inheritance for Extensibility
Recommendation: Use Properties and Methods for Attributes and Operations Essential to a Type
Recommendation: Avoid Revealing Concrete Data Representations Such as Records
Recommendation: Use Active Patterns to Hide the Implementations of Discriminated Unions
Recommendation: Use Object Interface Types Instead of Tuples or Records of Functions
Recommendation: Understand When Currying Is Useful in Functional Programming APIs
Recommendation: Use Tuples for Return Values, Arguments, and Intermediate Values
Some Recommended Coding Idioms
Recommendation: Use the Standard Operators
Recommendation: Place the Pipeline Operator |>
at the Start of a Line
Recommendation: Format Object Expressions Using the member Syntax
3.144.123.155