Contents at a Glance |
|
iv | |
Foreword |
|
xxi | |
About the Author |
|
xxiii | |
About the Technical Reviewer |
|
xxiv | |
Acknowledgments |
|
xv | |
|
|
1 | (6) |
|
|
1 | (1) |
|
|
2 | (3) |
|
|
5 | (2) |
|
Chapter 2 Getting Started with F# and .NET |
|
|
7 | (18) |
|
Creating Your First F# Program |
|
|
7 | (12) |
|
Documenting Code Using XMLDocs |
|
|
9 | (1) |
|
|
9 | (1) |
|
|
10 | (1) |
|
|
11 | (1) |
|
|
12 | (1) |
|
|
13 | (1) |
|
|
14 | (1) |
|
Using Properties and the Dot-Notation |
|
|
15 | (1) |
|
|
16 | (2) |
|
|
18 | (1) |
|
Using .NET Libraries from F# |
|
|
19 | (5) |
|
Using open to Access Namespaces and Modules |
|
|
20 | (1) |
|
Using new and Setting Properties |
|
|
21 | (1) |
|
|
22 | (2) |
|
|
24 | (1) |
|
Chapter 3 Creating Your First F# Prog---Introducing Functional Programming |
|
|
25 | (42) |
|
Getting Started with F# Arithmetic |
|
|
25 | (5) |
|
|
25 | (1) |
|
|
26 | (1) |
|
|
27 | (1) |
|
|
28 | (1) |
|
|
29 | (1) |
|
Overloaded Math Functions |
|
|
29 | (1) |
|
Introducing Simple Strings |
|
|
30 | (3) |
|
Working with String Literals and Primitives |
|
|
30 | (2) |
|
|
32 | (1) |
|
Working with Lists and Options |
|
|
33 | (5) |
|
|
33 | (4) |
|
|
37 | (1) |
|
Using Option Values for Control |
|
|
38 | (1) |
|
Working with Conditionals: && and II |
|
|
38 | (1) |
|
Defining Recursive Functions |
|
|
39 | (1) |
|
Introducing Function Values |
|
|
40 | (10) |
|
Using Anonymous Function Values |
|
|
41 | (1) |
|
Computing with Aggregate Operators |
|
|
42 | (2) |
|
Composing Functions with >> |
|
|
44 | (1) |
|
Building Functions with Partial Application |
|
|
45 | (1) |
|
|
46 | (1) |
|
Using Functions as Abstract Values |
|
|
47 | (1) |
|
Iterating with Aggregate Operators |
|
|
48 | (1) |
|
Abstracting Control with Functions |
|
|
48 | (1) |
|
Using .NET Methods as First-Class Functions |
|
|
49 | (1) |
|
Getting Started with Pattern Matching |
|
|
50 | (3) |
|
Matching on Structured Values |
|
|
51 | (2) |
|
Guarding Rules and Combining Patterns |
|
|
53 | (1) |
|
Getting Started with Sequences |
|
|
53 | (5) |
|
|
54 | (1) |
|
|
55 | (1) |
|
Transforming Sequences with Aggregate Operators |
|
|
55 | (1) |
|
Which Types Can Be Used as Sequences? |
|
|
56 | (1) |
|
Using Lazy Sequences from External Sources |
|
|
57 | (1) |
|
Using Sequence Expressions |
|
|
58 | (2) |
|
Creating Sequence Expressions Using for |
|
|
58 | (1) |
|
Enriching Sequence Expressions with Additional Logic |
|
|
59 | (1) |
|
Generating Lists and Arrays Using Sequence Expressions |
|
|
60 | (1) |
|
Exploring Some Simple Type Definitions |
|
|
60 | (6) |
|
Defining Type Abbreviations |
|
|
60 | (1) |
|
|
61 | (1) |
|
Handling Non-Unique Record Field Names |
|
|
62 | (1) |
|
|
63 | (1) |
|
Defining Discriminated Unions |
|
|
63 | (2) |
|
Using Discriminated Unions as Records |
|
|
65 | (1) |
|
Defining Multiple Types Simultaneously |
|
|
66 | (1) |
|
|
66 | (1) |
|
Chapter 4 Introducing Imperative Programming |
|
|
67 | (30) |
|
Imperative Looping and Interating |
|
|
68 | (1) |
|
|
68 | (1) |
|
|
68 | (1) |
|
More Iteration Loops over Sequences |
|
|
69 | (1) |
|
|
69 | (5) |
|
|
70 | (2) |
|
|
72 | (1) |
|
|
73 | (1) |
|
|
74 | (1) |
|
|
74 | (3) |
|
Generating and Slicing Arrays |
|
|
76 | (1) |
|
|
77 | (1) |
|
Introducing the Imperative .NET Collections |
|
|
77 | (4) |
|
|
78 | (1) |
|
|
79 | (1) |
|
Using Dictionary's TryGetValue |
|
|
79 | (1) |
|
Using Dictionaries with Compound Keys |
|
|
80 | (1) |
|
Some Other Mutable Data Structures |
|
|
81 | (1) |
|
Exceptions and Controlling Them |
|
|
81 | (4) |
|
|
83 | (1) |
|
|
83 | (1) |
|
Defining New Exception Types |
|
|
84 | (1) |
|
Having an Effect: Basic I/O |
|
|
85 | (6) |
|
Very Simple I/O: Reading and Writing Files |
|
|
85 | (1) |
|
|
86 | (1) |
|
Some Other I/O-Related Types |
|
|
87 | (1) |
|
|
88 | (1) |
|
|
88 | (2) |
|
Generic Structural Formatting |
|
|
90 | (1) |
|
Cleaning Up with IDisposable, use, and using |
|
|
90 | (1) |
|
|
91 | (1) |
|
Some Advice: Functional Programming with Side Effects |
|
|
92 | (4) |
|
Consider Replacing Mutable Locals and Loops with Recursion |
|
|
93 | (1) |
|
Separate Pure Computation from Side-Effecting Computations |
|
|
93 | (1) |
|
Separate Mutable Data Structures |
|
|
93 | (1) |
|
Not All Side Effects Are Equal |
|
|
94 | (1) |
|
Avoid Combining Imperative Programming and Laziness |
|
|
95 | (1) |
|
|
96 | (1) |
|
Chapter 5 Mastering Types and Generics |
|
|
97 | (26) |
|
Understanding Generic Type Variables |
|
|
97 | (1) |
|
Writing Generic Functions |
|
|
98 | (1) |
|
Understanding Some Important Generic Functions |
|
|
99 | (5) |
|
|
99 | (1) |
|
|
100 | (1) |
|
|
101 | (1) |
|
Generic Boxing and Unboxing |
|
|
101 | (1) |
|
Generic Binary Serialization via the .NET Libraries |
|
|
102 | (2) |
|
|
104 | (5) |
|
Generic Algorithms through Explicit Arguments |
|
|
104 | (2) |
|
Generic Algorithms through Abstract Object Types |
|
|
106 | (2) |
|
Arithmetic Operators and Generic Algorithms through Inlining |
|
|
108 | (1) |
|
|
109 | (2) |
|
Reference Types and Value Types |
|
|
109 | (1) |
|
Other Flavors of .NET Types |
|
|
110 | (1) |
|
|
111 | (4) |
|
|
111 | (1) |
|
|
111 | (1) |
|
Performing Type Tests via Pattern Matching |
|
|
112 | (1) |
|
Knowing When Upcasts Are Applied Automatically |
|
|
113 | (1) |
|
|
114 | (1) |
|
|
115 | (2) |
|
Troubleshooting Type-Inference Problems |
|
|
117 | (5) |
|
Using a Visual Editing Environment |
|
|
117 | (1) |
|
|
117 | (1) |
|
Understanding the Value Restriction |
|
|
118 | (1) |
|
Working Around the Value Restriction |
|
|
119 | (2) |
|
Understanding Generic Overloaded Operators |
|
|
121 | (1) |
|
|
122 | (1) |
|
Chapter 6 Working with Objects and Modules |
|
|
123 | (30) |
|
Getting Started with Objects and Members |
|
|
123 | (3) |
|
|
126 | (4) |
|
Adding Further Object Notation to Your Types |
|
|
130 | (5) |
|
Working with Indexer Properties |
|
|
130 | (1) |
|
Adding Overloaded Operators |
|
|
130 | (2) |
|
Using Named and Optional Arguments |
|
|
132 | (1) |
|
Using Optional Property Settings |
|
|
133 | (1) |
|
Adding Method Overloading |
|
|
134 | (1) |
|
Defining Object Types with Mutable State |
|
|
135 | (2) |
|
Getting Started with Object Interface Types |
|
|
137 | (6) |
|
Defining New Object Interface Types |
|
|
138 | (1) |
|
Implementing Object Interface Types Using Object Expressions |
|
|
139 | (1) |
|
Implementing Object Interface Types Using Concrete Types |
|
|
140 | (1) |
|
Using Common Object Interface Types from the .NET Libraries |
|
|
141 | (1) |
|
Understanding Hierarchies of Object Interface Types |
|
|
142 | (1) |
|
More Techniques to Implement Objects |
|
|
143 | (4) |
|
Combining Object Expressions and Function Parameters |
|
|
143 | (1) |
|
Defining Partially Implemented Class Types |
|
|
144 | (1) |
|
Using Partially Implemented Types via Delegation |
|
|
145 | (1) |
|
Using Partially Implemented Types via Implementation Inheritance |
|
|
145 | (2) |
|
Using Modules and Static Members |
|
|
147 | (1) |
|
Extending Existing Types and Modules |
|
|
148 | (2) |
|
Working with F# Objects and .NET Types |
|
|
150 | (2) |
|
|
151 | (1) |
|
|
151 | (1) |
|
|
151 | (1) |
|
|
152 | (1) |
|
Chapter 7 Encapsulating and Packaging Your Code |
|
|
153 | (22) |
|
|
153 | (6) |
|
Hiding Things with Local Definitions |
|
|
154 | (2) |
|
Hiding Things with Accessibility Annotations |
|
|
156 | (3) |
|
Using Namespaces and Modules |
|
|
159 | (2) |
|
Putting Your Code in a Namespace |
|
|
159 | (1) |
|
|
160 | (1) |
|
Creating Assemblies, DLLs, and EXEs |
|
|
161 | (6) |
|
|
161 | (1) |
|
|
161 | (2) |
|
Mixing Scripting and Compiled Code |
|
|
163 | (1) |
|
Choosing Optimization Settings |
|
|
164 | (1) |
|
|
164 | (1) |
|
Building Shared Libraries and Using the Global Assembly Cache |
|
|
165 | (1) |
|
|
166 | (1) |
|
Using Signature Types and Files |
|
|
167 | (2) |
|
Using Explicit Signature Types and Signature Files |
|
|
167 | (1) |
|
When Are Signature Types Checked? |
|
|
168 | (1) |
|
|
169 | (4) |
|
Packaging Different Kinds of Code |
|
|
169 | (1) |
|
Using Data and Configuration Settings |
|
|
170 | (3) |
|
|
173 | (2) |
|
Chapter 8 Mastering F#: Common Techniques |
|
|
175 | (32) |
|
Equality, Hashing, and Comparison |
|
|
175 | (5) |
|
Asserting Equality, Hashing, and Comparison Using Attributes |
|
|
176 | (1) |
|
Fully Customizing Equality, Hashing, and Comparison on a Type |
|
|
177 | (2) |
|
Suppressing Equality, Hashing, and Comparison on a Type |
|
|
179 | (1) |
|
Customizing Generic Collection Types |
|
|
179 | (1) |
|
Efficient Precomputation and Caching |
|
|
180 | (6) |
|
Precomputation and Partial Application |
|
|
180 | (2) |
|
Precomputation and Objects |
|
|
182 | (1) |
|
|
183 | (2) |
|
|
185 | (1) |
|
Other Variations on Caching and Memoization |
|
|
186 | (1) |
|
|
186 | (8) |
|
|
187 | (2) |
|
Managing Resources with More Complex Lifetimes |
|
|
189 | (1) |
|
Cleaning Up Internal Objects |
|
|
190 | (1) |
|
Cleaning Up Unmanaged Objects |
|
|
191 | (1) |
|
Cleaning Up in Sequence Expressions |
|
|
192 | (2) |
|
|
194 | (1) |
|
Stack as a Resource: Tail Calls and Recursion |
|
|
194 | (8) |
|
Tail Recursion and List Processing |
|
|
195 | (2) |
|
Tail Recursion and Object-Oriented Programming |
|
|
197 | (1) |
|
Tail Recursion and Processing Unbalanced Trees |
|
|
198 | (1) |
|
Using Continuations to Avoid Stack Overflows |
|
|
199 | (2) |
|
Another Example: Processing Syntax Trees |
|
|
201 | (1) |
|
|
202 | (3) |
|
Events as First-Class Values |
|
|
203 | (1) |
|
Creating and Publishing Events |
|
|
204 | (1) |
|
|
205 | (2) |
|
Chapter 9 Introducing Language-Oriented Programming |
|
|
207 | (42) |
|
Using XML as a Concrete Language Format |
|
|
208 | (5) |
|
Using the System.Xml Namespace |
|
|
208 | (2) |
|
From Concrete XML to Abstract Syntax |
|
|
210 | (3) |
|
Working with Abstract Syntax Representations |
|
|
213 | (7) |
|
Abstract Syntax Representations: Less is More |
|
|
213 | (1) |
|
Processing Abstract Syntax Representations |
|
|
213 | (2) |
|
Transformational Traversals of Abstract Syntax Representations |
|
|
215 | (1) |
|
Using On-Demand Computation with Abstract Syntax Trees |
|
|
215 | (2) |
|
Caching Properties in Abstract Syntax Trees |
|
|
217 | (1) |
|
Memoizing Construction of Syntax Tree Nodes |
|
|
218 | (2) |
|
Introducing Active Patterns |
|
|
220 | (5) |
|
Converting the Same Data to Many Views |
|
|
220 | (2) |
|
Matching on .NET Object Types |
|
|
222 | (1) |
|
Defining Partial and Parameterized Active Patterns |
|
|
223 | (1) |
|
Hiding Abstract Syntax Implementations with Active Patterns |
|
|
223 | (2) |
|
Embedded Computational Languages with Workflows |
|
|
225 | (14) |
|
An Example: Success/Failure Workflows |
|
|
227 | (3) |
|
Defining a Workflow Builder |
|
|
230 | (2) |
|
Workflows and Untamed Side Effects |
|
|
232 | (1) |
|
Example: Probabilistic Workflows |
|
|
233 | (5) |
|
Combining Workflows and Resources |
|
|
238 | (1) |
|
Recursive Workflow Expressions |
|
|
238 | (1) |
|
|
239 | (5) |
|
|
239 | (1) |
|
Schema Compilation by Reflecting on Types |
|
|
239 | (4) |
|
Using the F# Dynamic Reflection Operators |
|
|
243 | (1) |
|
|
244 | (4) |
|
Example: Using F# Quotations for Error Estimation |
|
|
245 | (2) |
|
Resolving Top Definitions |
|
|
247 | (1) |
|
|
248 | (1) |
|
Chapter 10 Using the F# and .NET Libraries |
|
|
249 | (22) |
|
|
249 | (4) |
|
Namespaces from the .NET Framework |
|
|
250 | (2) |
|
Namespaces from the F# Libraries |
|
|
252 | (1) |
|
|
253 | (2) |
|
Using Regular Expressions and Formatting |
|
|
255 | (7) |
|
Matching with System. Text. RegularExpressions |
|
|
255 | (5) |
|
Formatting Strings Using .NET Formatting |
|
|
260 | (1) |
|
Encoding and Decoding Unicode Strings |
|
|
261 | (1) |
|
Encoding and Decoding Binary Data |
|
|
262 | (1) |
|
Using Further F# and .NET Data Structures |
|
|
262 | (1) |
|
System.Collections.Generic and Other .NET Collections |
|
|
262 | (1) |
|
Introducing Microsoft.FSharp.Math |
|
|
263 | (2) |
|
Using Matrices and Vectors |
|
|
263 | (2) |
|
Using Operator Overloads on Matrices and Vectors |
|
|
265 | (1) |
|
Supervising and Isolating Execution |
|
|
265 | (1) |
|
Further Libraries for Reflective Techniques |
|
|
266 | (1) |
|
|
266 | (1) |
|
Using Microsoft.FSharp.Reflection |
|
|
267 | (1) |
|
Some Other .NET Types You May Encounter |
|
|
267 | (1) |
|
Some Other .NET Libraries |
|
|
268 | (1) |
|
|
269 | (2) |
|
Chapter 11 Building Graphical User Interfaces |
|
|
271 | (50) |
|
Writing "Hello, World!" in a Click |
|
|
271 | (1) |
|
Understanding the Anatomy of a Graphical Application |
|
|
272 | (1) |
|
Composing User Interfaces |
|
|
273 | (5) |
|
|
278 | (4) |
|
Writing Your Own Controls |
|
|
282 | (4) |
|
Developing a Custom Control |
|
|
282 | (3) |
|
|
285 | (1) |
|
Displaying Samples from Sensors |
|
|
286 | (12) |
|
Building the GraphControl: The Model |
|
|
288 | (2) |
|
Building the GraphControl: Style Properties and Controller |
|
|
290 | (3) |
|
Building the GraphControl: The View |
|
|
293 | (4) |
|
|
297 | (1) |
|
Creating a Mandelbrot Viewer |
|
|
298 | (11) |
|
|
299 | (1) |
|
|
300 | (3) |
|
Creating the Visualization Application |
|
|
303 | (2) |
|
Creating the Application Plumbing |
|
|
305 | (4) |
|
Windows Presentation Foundation |
|
|
309 | (11) |
|
|
311 | (1) |
|
|
312 | (3) |
|
|
315 | (3) |
|
|
318 | (2) |
|
|
320 | (1) |
|
|
320 | (1) |
|
Chapter 12 Working with Symbolic Representations |
|
|
321 | (34) |
|
Symbolic Differentiation and Expression Rendering |
|
|
322 | (18) |
|
Modeling Simple Algebraic Expressions |
|
|
322 | (2) |
|
Implementing Local Simplifications |
|
|
324 | (1) |
|
A Richer Language of Algebraic Expressions |
|
|
325 | (2) |
|
Parsing Algebraic Expressions |
|
|
327 | (2) |
|
Simplifying Algebraic Expressions |
|
|
329 | (2) |
|
Symbolic Differentiation of Algebraic Expressions |
|
|
331 | (1) |
|
|
332 | (6) |
|
Building the User Interface |
|
|
338 | (2) |
|
Verifying Circuits with Propositional Logic |
|
|
340 | (14) |
|
Representing Propositional Logic |
|
|
341 | (1) |
|
Evaluating Propositional Logic Naively |
|
|
342 | (2) |
|
From Circuits to Propositional Logic |
|
|
344 | (3) |
|
Checking Simple Properties of Circuits |
|
|
347 | (1) |
|
Representing Propositional Formulae Efficiently Using BDDs |
|
|
348 | (4) |
|
Circuit Verification with BDDs |
|
|
352 | (2) |
|
|
354 | (1) |
|
Chapter 13 Reactive, Asynchronous, and Parallel Programming |
|
|
355 | (36) |
|
Introducing Some Terminology |
|
|
356 | (1) |
|
Using and Designing Background Workers |
|
|
357 | (8) |
|
Building a Simpler Iterative Worker |
|
|
359 | (3) |
|
Raising Additional Events from Background Workers |
|
|
362 | (1) |
|
Connecting a Background Worker to a GUI |
|
|
363 | (2) |
|
Introducing Asynchronous and Parallel Computations |
|
|
365 | (12) |
|
Fetching Multiple Web Pages in Parallel, Asynchronously |
|
|
365 | (2) |
|
Understanding Thread Hopping |
|
|
367 | (1) |
|
Under the Hood: What Are Asynchronous Computations? |
|
|
368 | (2) |
|
Parallel File Processing Using Asynchronous Workflows |
|
|
370 | (4) |
|
Running Asynchronous Computations |
|
|
374 | (1) |
|
Common I/O Operations in Asynchronous Workflows |
|
|
374 | (1) |
|
Under the Hood: Implementing Async. Parallel |
|
|
375 | (1) |
|
Using async for CPU Parallelism with Fixed Tasks |
|
|
376 | (1) |
|
Understanding Exceptions and Cancellation |
|
|
376 | (1) |
|
Passing and Processing Messages |
|
|
377 | (8) |
|
Introducing Message Processing |
|
|
378 | (1) |
|
Creating Objects That React to Messages |
|
|
379 | (3) |
|
Scanning Mailboxes for Relevant Messages |
|
|
382 | (1) |
|
Example: Asynchronous Web Crawling |
|
|
383 | (2) |
|
Using Shared-Memory Concurrency |
|
|
385 | (4) |
|
Creating Threads Explicitly |
|
|
386 | (1) |
|
Shared Memory, Race Conditions, and the .NET Memory Model |
|
|
386 | (1) |
|
Using Locks to Avoid Race Conditions |
|
|
387 | (1) |
|
|
388 | (1) |
|
Some Other Concurrency Primitives |
|
|
389 | (1) |
|
|
389 | (2) |
|
Chapter 14 Building Smart Web Applications |
|
|
391 | (44) |
|
Serving Static Web Content |
|
|
391 | (4) |
|
Serving Dynamic Web Content with ASP.NET |
|
|
395 | (10) |
|
Understanding the Languages Used in ASP.NET |
|
|
397 | (2) |
|
A Simple ASP.NET Web Application |
|
|
399 | (3) |
|
Deploying and Running the Application |
|
|
402 | (2) |
|
|
404 | (1) |
|
Using ASP.NET Input Controls |
|
|
405 | (3) |
|
Displaying Data from Databases |
|
|
408 | (4) |
|
Going Further with ASP.NET |
|
|
412 | (10) |
|
|
412 | (1) |
|
|
413 | (2) |
|
Debugging, Profiling, and Tracing |
|
|
415 | (1) |
|
Understanding the ASP.NET Event Model |
|
|
416 | (2) |
|
Maintaining the View State |
|
|
418 | (1) |
|
Understanding the Provider Model |
|
|
419 | (1) |
|
Creating Custom ASP.NET Server Controls |
|
|
420 | (2) |
|
Building Ajax Rich Client Applications |
|
|
422 | (8) |
|
More on the WebSharper Platform |
|
|
422 | (8) |
|
|
430 | (4) |
|
|
430 | (3) |
|
Calling Web Services Asynchronously |
|
|
433 | (1) |
|
|
434 | (1) |
|
Chapter 15 Working with Data |
|
|
435 | (28) |
|
Querying In-Memory Data Structures |
|
|
435 | (4) |
|
Select/Where/From Queries Using Aggregate Operators |
|
|
436 | (1) |
|
Using Aggregate Operators in Queries |
|
|
436 | (1) |
|
Accumulating Using Folding Operators |
|
|
437 | (1) |
|
Expressing Some Queries Using Sequence Expressions |
|
|
438 | (1) |
|
Using Databases to Manage Data |
|
|
439 | (13) |
|
Choosing Your Database Engine |
|
|
441 | (1) |
|
|
442 | (1) |
|
Establishing Connections to a Database Engine |
|
|
443 | (1) |
|
|
443 | (2) |
|
Creating Tables and Inserting and Fetching Records |
|
|
445 | (2) |
|
|
447 | (2) |
|
Generating Typed Datasets Using xsd.exe |
|
|
449 | (2) |
|
|
451 | (1) |
|
|
452 | (1) |
|
Working with Databases in Visual Studio |
|
|
452 | (3) |
|
|
452 | (1) |
|
Visual Data Modeling: Adding Relationships |
|
|
453 | (2) |
|
Accessing Relational Data with Linq Queries |
|
|
455 | (3) |
|
Generating the Object/Relational Mapping |
|
|
455 | (1) |
|
Building the DataContext Instance |
|
|
456 | (1) |
|
|
456 | (2) |
|
Working with XML as a Generic Data Format |
|
|
458 | (3) |
|
Constructing XML via LINQ |
|
|
459 | (1) |
|
Storing, Loading, and Traversing LinqToXml Documents |
|
|
460 | (1) |
|
|
461 | (1) |
|
|
461 | (2) |
|
Chapter 16 Lexing and Parsing |
|
|
463 | (28) |
|
Processing Line-Based Input |
|
|
464 | (2) |
|
On-Demand Reading of Files |
|
|
465 | (1) |
|
Using Regular Expressions |
|
|
465 | (1) |
|
|
466 | (8) |
|
The FsLex Input in More Detail |
|
|
469 | (1) |
|
Generating a Simple Token Stream |
|
|
470 | (2) |
|
Tracking Position Information Correctly |
|
|
472 | (1) |
|
Handling Comments and Strings |
|
|
473 | (1) |
|
Recursive-Descent Parsing |
|
|
474 | (5) |
|
Limitations of Recursive-Descent Parsers |
|
|
478 | (1) |
|
|
479 | (7) |
|
|
480 | (1) |
|
|
481 | (2) |
|
|
483 | (1) |
|
Resolving Conflicts, Operator Precedence, and Associativity |
|
|
483 | (1) |
|
|
484 | (2) |
|
Binary Parsing and Pickling Using Combinators |
|
|
486 | (3) |
|
|
489 | (2) |
|
Chapter 17 Interoperating with C and COM |
|
|
491 | (32) |
|
|
491 | (2) |
|
Memory Management at Runtime |
|
|
493 | (2) |
|
|
495 | (12) |
|
|
507 | (14) |
|
Getting Started with PInvoke |
|
|
509 | (1) |
|
|
510 | (3) |
|
|
513 | (3) |
|
|
516 | (1) |
|
|
517 | (3) |
|
Wrapper Generation and Limits of PInvoke |
|
|
520 | (1) |
|
|
521 | (2) |
|
Chapter 18 Debugging and Testing F# Programs |
|
|
523 | (22) |
|
|
524 | (9) |
|
Using Advanced Features of the Visual Studio Debugger |
|
|
526 | (2) |
|
Instrumenting Your Program with the System. Diagnostics Namespace |
|
|
528 | (3) |
|
Debugging Concurrent and Graphical Applications |
|
|
531 | (2) |
|
Debugging and Testing with F# Interactive |
|
|
533 | (5) |
|
Controlling F# Interactive |
|
|
534 | (1) |
|
Some Common F# Interactive Directives |
|
|
535 | (1) |
|
Understanding How F# Interactive Compiles Code |
|
|
535 | (2) |
|
F# Interactive and Visual Studio |
|
|
537 | (1) |
|
|
538 | (5) |
|
|
543 | (2) |
|
Chapter 19 Designing F# Libraries |
|
|
545 | (18) |
|
Designing Vanilla .NET Libraries |
|
|
546 | (4) |
|
Understanding Functional Design Methodology |
|
|
550 | (3) |
|
Applying the .NET Library Design Guidelines to F# |
|
|
553 | (7) |
|
Some Recommended Coding Idioms |
|
|
560 | (1) |
|
|
561 | (2) |
Appendix F Brief Language Guide |
|
563 | (8) |
Index |
|
571 | |