Why Haskell?
(This post is also available as a YouTube video!)
When I tell other programmers I do a lot of programming in Haskell, a common question is "Why"? What is so good about Haskell that it's worth learning a language that is so different from the vast majority of software. And there are a few different things I usually think of, but the biggest one that sticks out for me is the way Haskell structures effects. I think these structures have really helped me change the way I think about programming, and knowing these ideas has made me a more effective developer, even in other languages.
Defining Effects
Now you might be wondering, what exactly is an effect? Well to describe effects, let's first think about a "pure" function. A pure function has no inputs besides the explicit parameters, and the only way it impacts our program's behavior is through the value it returns.
// A simple, pure, function
public int addWith5(int x, int y) {
int result = x + y + 5;
return result;
}
We can define an effect as, well, anything outside of that paradigm. This can be as simple as an implicit mutable input to the function like a global variable.
// Global mutable variable as in "implicit" input
global int z;
public int addWith5(int x, int y) {
int result = x + y + 5 + z; // < z isn't a function parameter!
return result;
}
Or it can be something more complicated like writing something to the file system, or making an HTTP request to an API.
// More complicated effects (pseudo-code)
public int addWith5(int x, int y) {
int result = x + y + 5;
WriteFile("result.txt", result);
API.post(makeRequest(result));
return result;
}
Once our function does these kinds of operations, its behavior is significantly less predictable, and that can cause a lot of bugs.
Now a common misconception about Haskell is that it does not allow side effects. And this isn't correct. What is true about Haskell is that if a function has side effects, these must be part of its type signature, usually in the form of a monad, which describes the full computational context of the function.
A function in the State monad can update a shared global value in some way.
updateValue :: Int -> State Int Int
A function in the IO monad can write to the file system or even make a network call.
logAndSendRequest :: Req -> IO Result
Doing this type-level documentation helps avoid bugs and provide guarantees about parts of our program at compile time, and this can be a real lifesaver.
Re-thinking Code
In the last few years I've been writing about Haskell during my free time but using C++ and Python in my day job. And so I have a bigger appreciation for the lessons I learned from Haskell's effect structures and I've seen that my code in other languages is much better because I understand these lessons.
New Course: Effectful Haskell!
And this is why I'm excited to introduce my newest course on the Monday Morning Haskell Academy. This one is called Effectful Haskell, and I think it might be the most important course I've made so far, because it really zeroes in on this idea of effects. For me, this is the main idea that separates Haskell from other languages. But at the same time, it can also teach you to be a better programmer in these other languages.
This course is designed to give you hands-on experience with some of the different tools and paradigms Haskell has for structuring effects. It includes video lectures, screencasts, and in depth coding exercises that culminate with you launching a small but multi-functional web server.
If you've dabbled a bit in Haskell and you understand the core ideas, but you want to see what the language is really capable of, I highly recommend you try out this course. You can head to the course sales page to see an overview of the course as well as the FAQ. I'll mention a couple special items.
First, there is a 30-day refund guarantee if you decide you don't like the course.
And second, if you subscribe (or are already subscribed) to the Monday Morning Haskell newsletter, you'll get a 20% discount code for this and our other courses! So I hope you'll take a look and try it out.