Effective Haskell (Pragmatic Bookshelf)

PragmaticBookshelf
Build efficient applications that exploit the unique benefits of a pure functional language, learning from an engineer who uses Haskell to do practical work.

Rebecca Skinner @RebeccaSkinner

edited by Michael Swaine @michaelswaine

Put the power of Haskell to work in your programs, learning from an engineer who uses Haskell daily to get practical work done efficiently. Leverage powerful features like Monad Transformers and Type Families to build useful applications. Realize the benefits of a pure functional language, like protecting your code from side effects. Manage concurrent processes fearlessly. Apply functional techniques to working with databases and building RESTful services. Don’t get bogged down in theory, but learn to employ advanced programming concepts to solve real-world problems. Don’t just learn the syntax, but dive deeply into Haskell as you build efficient, well-tested programs.

Haskell is a pure functional programming language with a rich ecosystem of tools and libraries. Designed to push the boundaries of programming, it offers unparalleled power for building reliable and maintainable systems. But to unleash that power, you need a guide. Effective Haskell is that guide. Written by an engineer who understands how to apply Haskell to the real world and uses it daily to get practical work done, it is your ticket to Haskell mastery.

Gain deep understanding of how Haskell deals with IO and the outside world by writing a complete Haskell application that does several different kinds of IO. Reinforce your learnings with practice exercises in every chapter.

Write stable and performant code using Haskell’s type system, code that is easier to grow and refactor. Leverage the power of pure functional programming to improve collaboration, make concurrency safe and easy, and make large code bases manageable.

Implement type-safe web services, write generative tests, design strongly typed embedded domain-specific languages, and build applications that exploit parallelism and concurrency without fear of deadlocks and race conditions. Create and deploy cloud-native Haskell applications. Master the performance characteristics of functional applications to make them run faster and use less memory.

Write Haskell programs that solve real-world business problems.


Rebecca Skinner is a software engineer with over 10 years of experience in Haskell and functional programming across industries including security, cloud infrastructure, and data science. She currently volunteers as a member of the Haskell.org committee.


*Don’t forget you can get 35% off with your Devtalk discount! Just use the coupon code “devtalk.com" at checkout :+1:

Latest Threads About This Book Top

lambdacalculator
@RebeccaSkinner Both module statements in the code examples on pp. xvii and xviii in the Introduction (“Following Along with Example Cod...
New
vvnurmi
@RebeccaSkinner On page 198, when phantom types are introduced, when listing other changes to the code example at hand, also this necess...
New
vvnurmi
@RebeccaSkinner The book seems to be missing an import statement like λ import HaskellBook.Examples.Introduction.CreatingModules (Name ...
New
vvnurmi
the (<>) operator would get passed to the function show instead of the string we get back when we say show 1. I think it should ...
New
New
tusktenon
@RebeccaSkinner On p.61 in Chapter 2, the following is described as finding “the sum of the first ten odd numbers”: λ (foldr (+) 0 . fi...
New
javabean68
Title: Effective Haskell - Kindle Edition Chapter: 1 Section: Precedence, Operators, and Fixity In the first expression, ((((((add add)...
New
jrinaldi
@RebeccaSkinner Currently, it is: sumOfUniques n = ​ foldr (add n) (additiveIdentity n) . unique n It should be: sumOfUniques n = ​ ...
New
MeEd
@RebeccaSkinner At the bottom of page 31 when let is added to the example greeting I cannot get the example to work. I’ve tried rechecki...
New
andre
Refer to pages 508-511 I get an infinite loop when running the original parseArchive function, after adding a variable called "archiveD...
New

Most Active This Week Top

Most Active This Month Top

Most Active This Year Top

New
vvnurmi
the (<>) operator would get passed to the function show instead of the string we get back when we say show 1. I think it should ...
New
vvnurmi
@RebeccaSkinner On page 198, when phantom types are introduced, when listing other changes to the code example at hand, also this necess...
New
vvnurmi
@RebeccaSkinner The book seems to be missing an import statement like λ import HaskellBook.Examples.Introduction.CreatingModules (Name ...
New
lambdacalculator
@RebeccaSkinner Both module statements in the code examples on pp. xvii and xviii in the Introduction (“Following Along with Example Cod...
New

Most Active Last Three Years Top

PragmaticBookshelf
Author Spotlight Rebecca Skinner @RebeccaSkinner Welcome to our latest author spotlight, where we sit down with Rebecca Skinner, auth...
New
pennychase
Effective Haskell Chapter 8 getTerminalSize (Epub p 243) used pure in the case statement and return in the definition of tputScreenDime...
New
pennychase
Defining Functor for Either Section (p. 270 ff ePub): The discussion of the kind error seems as thought kinds have not been introduced ...
New
andre
@RebeccaSkinner Thanks you for this beautiful book. Chapter 8 - p.317 3rd paragraph from the bottom If you build your application and ...
New
pennychase
In toCsv (ePub p 157, dropLeadingComma will leave a leading space. In the case statement, the first case is ‘,’:s’ → s’ and it should be ...
New
molleweide
@RebeccaSkinner, page 141. calculator. I suggest you explain a little more about why you introduced the Left and Right types in the Cal...
New
yaronf
“You’ll notice that in all of the examples so far, we’ve created lists that only contain numbers” - this is incorrect, one of the first e...
New
pennychase
@RebeccaSkinner In Effective Haskell Chapter 11 (~ p 410 in ePub), when creating the Encode and Decode instances for String, pack and un...
New
molleweide
@RebeccaSkinner, Allright, so I have put all of the example code for Calculator in chapter 4 on page ~140 in a file and when loading it ...
New
juhp
@RebeccaSkinner In beta 9.0 A small typo near the bottom of p83: “but it there are some extra moving parts” Probably"it" should be dr...
New
molleweide
Hi @RebeccaSkinner, In for example the Calculator segment of chapter 4, if I run the examples in GHCI this error is returned: λ: Ad...
New
pennychase
In the description of the algorithm for truncateStatus, the third bullet says “If the length of the status line is longer than the displa...
New
slayd
Please use the following format for the title of this thread (then simply delete/replace this text with the content for the thread): Eff...
New
pennychase
@RebeccaSkinner In the “Creating New Variables” section of Chapter 1, it says that you can’t reassign variables once defined. But new Ha...
New
molleweide
This is just a general note on UI and helping with the book. pragprog should make it easier for me as user to edit my erratas/suggestion...
New

Most Active Over Three Years Top

PragmaticBookshelf
Build efficient applications that exploit the unique benefits of a pure functional language, learning from an engineer who uses Haskell t...
New
pennychase
At the end of “Depending on Other Files” (ePub p 153), it says “In the next section you’ll learn the basics of Haskell’s syntax and gramm...
New
pennychase
In Chapter 8, (Viewing Text One Page at a Time), when defining groupsOf, it says we should use a polymorphic type in the type signature, ...
New
pennychase
In the “Functions as Data Types” section of Chapter 4 (ePub p 113), the takeDigits parser is introduced as “we could take some digits fro...
New
DW_Roth
Title: Effective Haskell - Example doesn’t work (page 8) Middle of page 8 says: "Create a new Main.hs and copy the example below to get ...
New
eponymous
“Much of this {difficult~>difficulty} is due to the complexity inherent in modern systems. ” “Today, software needs to do more things...
New
pennychase
At the beginning of the Composing Functions subsection in Chapter 1 it says: “You’ve already done this kind of implicit function composit...
New
waj
Functions that accept arguments in any order are called “commutative”, not “associative”. Note that this is mentioned twice in the same p...
New
jbcrail
To be more concise and minimize the number of threads, I grouped the suggested corrections into one post. A few notes on how I structure...
New
belega
The addPeano function switches the arguments in the recursive call. The implementation should be: addPeano Z b = b addPeano (S a) b = a...
New
jbcrail
To be more concise and minimize the number of threads, I grouped the suggested corrections into one post. A few notes on how I structure...
New
pennychase
In the “Filtering List Elements” section, the party budget function is first called “foodBudget” and all subsequent reference are “partyB...
New
darrenfehrmann
On page 19, the last line of the guard clause code snippet: | otherwise = “that’s an unfathomalbly big number” has “unfathomably” missp...
New
DW_Roth
Title: Effective Haskell - lambda example would help (pages 8-9) At the bottom of page 8 and the top of page 9 lambdas are described. I ...
New
pennychase
The discussion of why 1 'div' 0 isn’t evaluated in lazyIODemo (ePub p 214) could be expanded. The rationale (don’t want to read an entire...
New

Get money off!

The Pragmatic Bookshelf

35% off any eBook

Simply use coupon code "devtalk.com" at checkout. See full details here.