| |
| |
Dedication | |
| |
| |
Preface | |
| |
| |
Have We Got a Deal for You! | |
| |
| |
What to Expect from This Book | |
| |
| |
What to Expect from Haskell | |
| |
| |
A Brief Sketch of Haskell's History | |
| |
| |
Helpful Resources | |
| |
| |
Conventions Used in This Book | |
| |
| |
Using Code Examples | |
| |
| |
Safari(r) Books Online | |
| |
| |
How to Contact Us | |
| |
| |
Acknowledgments | |
| |
| |
| |
Getting Started | |
| |
| |
| |
Your Haskell Environment | |
| |
| |
| |
Getting Started with ghci, the Interpreter | |
| |
| |
| |
Basic Interaction: Using ghci as a Calculator | |
| |
| |
| |
Command-Line Editing in ghci | |
| |
| |
| |
Lists | |
| |
| |
| |
Strings and Characters | |
| |
| |
| |
First Steps with Types | |
| |
| |
| |
A Simple Program | |
| |
| |
| |
Types and Functions | |
| |
| |
| |
Why Care About Types? | |
| |
| |
| |
Haskell's Type System | |
| |
| |
| |
What to Expect from the Type System | |
| |
| |
| |
Some Common Basic Types | |
| |
| |
| |
Function Application | |
| |
| |
| |
Useful Composite Data Types: Lists and Tuples | |
| |
| |
| |
Functions over Lists and Tuples | |
| |
| |
| |
Function Types and Purity | |
| |
| |
| |
Haskell Source Files, and Writing Simple Functions | |
| |
| |
| |
Understanding Evaluation by Example | |
| |
| |
| |
Polymorphism in Haskell | |
| |
| |
| |
The Type of a Function of More Than One Argument | |
| |
| |
| |
Why the Fuss over Purity? | |
| |
| |
| |
Conclusion | |
| |
| |
| |
Defining Types, Streamlining Functions | |
| |
| |
| |
Defining a New Data Type | |
| |
| |
| |
Type Synonyms | |
| |
| |
| |
Algebraic Data Types | |
| |
| |
| |
Pattern Matching | |
| |
| |
| |
Record Syntax | |
| |
| |
| |
Parameterized Types | |
| |
| |
| |
Recursive Types | |
| |
| |
| |
Reporting Errors | |
| |
| |
| |
Introducing Local Variables | |
| |
| |
| |
The Offside Rule and Whitespace in an Expression | |
| |
| |
| |
The case Expression | |
| |
| |
| |
Common Beginner Mistakes with Patterns | |
| |
| |
| |
Conditional Evaluation with Guards | |
| |
| |
| |
Functional Programming | |
| |
| |
| |
Thinking in Haskell | |
| |
| |
| |
A Simple Command-Line Framework | |
| |
| |
| |
Warming Up: Portably Splitting Lines of Text | |
| |
| |
| |
Infix Functions | |
| |
| |
| |
Working with Lists | |
| |
| |
| |
How to Think About Loops | |
| |
| |
| |
Anonymous (lambda) Functions | |
| |
| |
| |
Partial Function Application and Currying | |
| |
| |
| |
As-patterns | |
| |
| |
| |
Code Reuse Through Composition | |
| |
| |
| |
Tips for Writing Readable Code | |
| |
| |
| |
Space Leaks and Strict Evaluation | |
| |
| |
| |
Writing a Library: Working with JSON Data | |
| |
| |
| |
A Whirlwind Tour of JSON | |
| |
| |
| |
Representing JSON Data in Haskell | |
| |
| |
| |
The Anatomy of a Haskell Module | |
| |
| |
| |
Compiling Haskell Source | |
| |
| |
| |
Generating a Haskell Program and Importing Modules | |
| |
| |
| |
Printing JSON Data | |
| |
| |
| |
Type Inference Is a Double-Edged Sword | |
| |
| |
| |
A More General Look at Rendering | |
| |
| |
| |
Developing Haskell Code Without Going Nuts | |
| |
| |
| |
Pretty Printing a String | |
| |
| |
| |
Arrays and Objects, and the Module Header | |