Logo

dev-resources.site

for different kinds of informations.

Scala is one of the best ways to learn Haskell

Published at
9/17/2024
Categories
scala
haskell
functional
Author
zelenya
Categories
3 categories in total
scala
open
haskell
open
functional
open
Author
7 person written this
zelenya
open
Scala is one of the best ways to learn Haskell

First, a reminder: You DON’T NEED TO learn Haskell — that’s not what I want to talk about. I genuinely want to talk about learning Haskell, and Haskell specifically — not functional programming.

The following might interest you if you want to get into Haskell for personal reasons (if you think it’s cool, well-paid, or whatever). If not — idk…


📹 Hate reading articles? Check out the complementary video, which covers the same content.

Haskell is tough to learn

People constantly report about their frustration with learning Haskell. Working professionals already have some experience and expectations from using a language. For example, a Java developer can pick up Go and carry over most of their knowledge, while Haskell can crash all their assumptions about programming.

How is it that I know how to connect to databases, serve http, make decent uis, or all the other cool stuff — but then I can’t simply print a variable in Haskell or get the value out of some box?!

We can blame it on education, learning resources, skills, or whatever… but the thing is: there are too many things to joggle in Haskell. Imagine a Java developer. If they want to learn Go, they need to learn new concurrency mechanisms, pay some attention to syntax (still C family), unlearn inheritance, resist using abstract factories, get used to a couple of other things, and that’s pretty much it (I know, it’s a bit oversimplified).

But then imagine them learning Haskell — now there are more unfamiliar faces: laziness, purity, IO, type classes, immutable collections, entirely different syntax, etc. — and see them getting crashed by the balls.

One step at a time

Scala is a multi-paradigm language that allows you to tame this gap and learn one ball at a time.

The most stereotypical example is starting with Scala as a better Java (a bit of new syntax and constructs) and then building on top of that: introducing immutable collections, other immutability, purity, type classes, IO, and so on.

If you don’t know how to do something in a “functional” way, do what you know until you learn how: write a for loop, print in the middle whatever you want, throw an exception — it’s your life, don’t let anyone tell you what to do. You’ll eventually figure it all out.

And then, at some point, you “just” get familiar with Haskell’s syntax and laziness, and you're good to go. It’s quite enough to contribute at a middle or even senior level. Yeah, there is still plenty to learn to be proficient. There is always going to be something to learn with Haskell.

The best part about this flow is it can be done at a personal pace. For instance, you can be productive for years with basic Scala + immutability + ADTs without fully grokking type classes and using IO, then grok type classes and be productive with that, and so on… And if you want to deeply understand the concept before moving to the next one, you can do it too. Good luck doing that with Haskell directly.

There is a reason that Scala’s logos is a ladder. (It’s a joke; please don’t quote me on that).

No silver bullet

This way of learning Haskell is not a silver bullet — it’s just one path, which I think is worth considering. It comes naturally to some, judging by dozens of people I know who learned Haskell this way. But might seem unintuitive or even stupid to others.

Sure, if you’re taking your time studying Haskell in school, it’s a whole different thing. But if you’re already working in the industry, want to invest your free time into learning Haskell and Haskell books and courses don’t work for you (because they’re either too long and tedious or jump over the concepts, hand-wave, and tell you to wait for explanation in later chapters), consider the Scala path.

Also, Scala is just an example I’m confident with. I guess learning via OCaml might be close enough. I can’t vouch for it — I don’t know anyone who learned Haskell via OCaml (not because they don’t exist, but because they are out of my bubbles). Something like Gleam or Roc could be good as well…

Also, if you have Rust experience, you can jump to Haskell right away because the gap is smaller. But I wouldn’t recommend learning Rust just to learn Haskell, though…

And if you come with a JavaScript background, PureScript or Elm is a good pitstop before trying Haskell.

You have to decide for yourself.

A metaphor

Look at it this way. Imagine you want to learn to be an artist.

You can start painting (with whatever medium), where you must joggle shapes, values, colors, light, and shadow. I’m not even talking about other fundamentals (like subject, composition, or perspective). This is just the minimum, and it could already be overwhelming.

That’s why lots of people start with something like drawing with charcoal and restrict to basic shapes and values. For starters, you don’t have to worry about colors or try to understand shadows — just treat everything as shapes. And later, add perspective, light, complex shapes, or whatever you like.

And, of course, some people directly pick up painting without drawing experience (and don’t get overwhelmed).

haskell Article's
30 articles in total
Favicon
Aritmética de Peano em Haskell
Favicon
From C# to Haskell and Back Again: My Journey into Functional Programming
Favicon
gRPC, Haskell, Nix, love, hate
Favicon
Advent of Code and Aesthetics
Favicon
Writing APIs Without Servant vs. Using Servant
Favicon
Type-Level Web DSL in Haskell
Favicon
A Guide to Functional Programming
Favicon
Top Open Source functional programming technologies
Favicon
Scala is one of the best ways to learn Haskell
Favicon
More Haskell Diagrams: Images
Favicon
Introduction to Haskell Diagrams
Favicon
Executable Blog Posts: Second Take
Favicon
Udemy: Learning Path: Haskell: Functional Programming and Haskell
Favicon
Abusing Haskell: Executable Blog Posts
Favicon
NeoHaskell v0.4.0: Update with Concurrency Fixes and Architectural Improvements
Favicon
More Haskell Diagrams: Contribution Graph
Favicon
Scala for Haskell developers
Favicon
Introducing NeoHaskell v0.3.0: Triggers, Actions, and Services
Favicon
Common Lisp VS Haskell
Favicon
Most Modern Software engineers are not engineers at all.
Favicon
Parsers are relative bimonads
Favicon
Implementing Haskell's lazy evaluation in MoonBit (Part. 3)
Favicon
Hacking Watson with Haskell - Part 3
Favicon
Using niv to Manage Haskell Dependencies
Favicon
Hacking Watson with Haskell - Part 2
Favicon
Hacking Watson with Haskell - Part 1
Favicon
More Haskell Diagrams: Dynamic OpenGraph Images
Favicon
More Haskell Diagrams: Wrapping Text
Favicon
More Haskell Diagrams: OpenGraph Images
Favicon
Indexable Containers in Haskell

Featured ones: