this post was submitted on 11 Sep 2025
39 points (100.0% liked)

Programming

22679 readers
81 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities !webdev@programming.dev



founded 2 years ago
MODERATORS
 

Specifically, I'm interested in BEAM, but I'm not sure if I should go for Elixir or Gleam. What seems cool about Gleam is that it has static typing.

I have no experience with functional programming at all btw

top 50 comments
sorted by: hot top controversial new old
[–] NostraDavid@programming.dev 21 points 4 days ago (3 children)

Haskell:

https://learnyouahaskell.com/introduction

It's been a while since writing some (2018), but the concepts you learn from Haskell are great (though I still can't explain Monads, even if my life depended on it) and can be applied in other languages.

Anyway, I can't speak to BEAM, but Haskell is very typeful, it teaches you currying, very great language, awful tooling (but that was ~10 years ago, so I hope things have improved since).

[–] Kache@lemmy.zip 8 points 4 days ago (2 children)

In practical terms, "monad" means "chainable".

[–] azolus@slrpnk.net 3 points 4 days ago

And I thought it was about morphisms and burritos. The more you know...

[–] Sxan@piefed.zip 1 points 3 days ago
[–] Corbin@programming.dev 4 points 3 days ago

Haskell isn't the best venue for learning currying, monads, or other category-theoretic concepts because Hask is not a category. Additionally, the community carries lots of incorrect and harmful memes. OCaml is a better choice; its types don't yield a category, but ML-style modules certainly do!

@thingsiplay@beehaw.org and @Kache@lemmy.zip are oversimplifying; a monad is a kind of algebra carried by some endofunctor. All endofunctors are chainable and have return values; what distinguishes a monad is a particular signature along with some algebraic laws that allow for refactoring inside of monad operations. Languages like Haskell don't have algebraic laws; for a Haskell-like example of such laws, check out 1lab's Cat.Diagram.Monad in Agda.

[–] thingsiplay@beehaw.org 2 points 4 days ago (1 children)

When I read about Monads, it looks like to me like generic Rust struct with a generic trait and a (more complex) result as a return value. I have no idea if this is what a Monad basically is or not. For context, I never learned Haskell properly (just tried hello world and read a few topics).

[–] bitcrafter@programming.dev 6 points 4 days ago (1 children)

You should think of Monad as basically giving you a way to provide your own implementation of the semicolon operator so that you can dictate what it means to sequence computations of a given type.

[–] thingsiplay@beehaw.org 3 points 4 days ago

I think the mistake I do (and many others) is trying to compare existing mechanisms from other languages, without the full picture around that mechanic. Every time I think to understand what a Monad is, its wrong. :D Guess I have to dive deeper to understand what that actually means, not just as an explanation. Just out of curiosity.

[–] masterspace@lemmy.ca 6 points 3 days ago (2 children)

I assume this suggestion will get me torched for reasons I don't understand, but why not a multi-paradigm language like JavaScript/Typescript, or C#?

I feel like this is the way. It ensures you get exposed to multiple paradigms and can help you easily switch to a language that's more invested in one paradigm.

[–] XM34@feddit.org 0 points 3 days ago

I second this. And bonus point: This way you'll learn a language that has actual real world applications. All thos obscure single paradigm languages are nice toys to play around with, but that's about it.

[–] darklamer@lemmy.dbzer0.com 14 points 4 days ago (1 children)

"Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot." — Eric S. Raymond, How to Become a Hacker

[–] bitcrafter@programming.dev 2 points 4 days ago (1 children)
[–] AbelianGrape@beehaw.org 1 points 3 days ago

Raymond's document does not, and I believe never has, mentioned Haskell.

I also disagree with him, given that it does recommend Java, but the quote is correct.

[–] littleomid@feddit.org 11 points 4 days ago (2 children)

Why do you want to learn functional programming? If just for fun and learning, then you can’t go wrong with scheme.

[–] lena@gregtech.eu 7 points 4 days ago (1 children)

Kinda funny, I've also been thinking about scheme as another option. Yes, (currently) it is just for fun and learning.

[–] gedhrel@lemmy.world 4 points 4 days ago (1 children)

Another great avenue into this world is Racket. The tooling is fantastic and the documentation culture is first-class.

[–] AlligatorBlizzard@sh.itjust.works 2 points 4 days ago (1 children)

I had Racket as an intro class language but haven't really gone beyond the beginner level (I also took another beginner class in Fortran, long story but I don't hate Fortran, lol) but at that level I enjoyed it. How similar is it to Clojure and what's my next steps to actually being competent-ish (and maybe employable) from here?

[–] gedhrel@lemmy.world 2 points 3 days ago* (last edited 3 days ago)

Clojure has it's own set of idioms; it comes with some small surprises for old lisp hands. There are some things it's really brought into the mainstream: performant persistent data structures in particular.

As well as excellent tooling and pedagogy, the principle attraction of Racket is the macro system. There's a great book about this (this is true of just about all aspects of Racket). Racket's focus is on building a tower of languages via macro extension. Metaprogramming is thematically FP-adjacent but neither sufficient or necessary; but if you're looking for a fun learning experience it's really worth a look.

In terms of employment opportunities - I know of several Clojure shops (on the JVM it has the bonus of being able to take advantage of the hole ecosystem), but I'm not aware of anywhere that's using Racket outside of the academic sphere.

[–] frankenswine@lemmy.world 3 points 4 days ago (1 children)

GNU Guile or Racket. from the language side every scheme is a scheme though. it kinda depends what you want to do with it

SICP is great for a very general in-depth intro

[–] littleomid@feddit.org 5 points 4 days ago

SICP is very hard for a beginner. I recommend little schemer.

[–] atzanteol@sh.itjust.works 10 points 4 days ago (1 children)

Clojure always seems to be more popular than I expect it to be. Though I have no experience with it myself. It benefits from access to the JVM ecosystem as well I believe.

[–] brian@programming.dev 4 points 4 days ago

I love clj. in general it takes more of a pragmatic approach to functional programming than others. you get most of the purity for way less effort. same with specs over proper static types. it just ends up being a very enjoyable and productive language

[–] mikedd@lemmy.world 3 points 3 days ago

I did a functional programming course in university snd we learned Haskell and really loved it. By far my favourite subject in all 4 years of uni. Have never used it since tho but it was fun XD

[–] gedhrel@lemmy.world 8 points 4 days ago (1 children)

I'd go with Erlang over elixir, but it sounds like you already have an interest in gleam.

FWIW: just pick one and get started. There are some major axes to consider: pure versus impure, lazy versus strict, static versus dynamic typing, but to kick off if you've done no FP before it's probably better to just go for it.

There are some really intriguing "next steps": SICP, the ML module system, the Haskell ecosystem, the OTP approach to state, but to begin with it's just worth getting used to some basics.

[–] lena@gregtech.eu 1 points 3 days ago

Yeah, I'll just go with Gleam :3

[–] qaz@lemmy.world 2 points 3 days ago

F# is a decent introduction into functional programming. You can use .NET libraries and occasionally fall back to imperative code when needed.

[–] darklamer@lemmy.dbzer0.com 6 points 4 days ago

I'd just like to mention ML, as I myself found its type system really enlightening.

[–] resipsaloquitur@lemmy.world 6 points 4 days ago
[–] AsimovIV@discuss.tchncs.de 5 points 4 days ago

Elixir is quite amazing to write and read, the major libraries (Pheonix, Ecto, etc.) have excellent documentation, the tools are generally excellent and it is built on to BEAM which is amazing. But it is a dynamically typed language with all the pain that can incur. Of course, there are tools (such as Dialyzer) to give some amount of static type checking but they were not very good when I tried them some years ago. Using things that need mutation can also be a pain. Programming Elixir 1.6 Functional |> Concurrent |> Pragmatic |> Fun was the book I used to learn functional programming and Elixir and it served me well.

There are other good languages you can look into such as Ocaml (that has good free resources for new programmers) and Racket with the amazing free course you can find on OSSU.

[–] tetrislife@leminal.space 4 points 4 days ago (1 children)

My ₹1. It may depend on what you plan to write in it (for fun). The BEAM sounds great for long-running processes, but not as much for point tools; Erlang and co supposedly run slower than Python, which isn't fast either.

My other ₹ ;-) if you stick to the BEAM: OCaml sort of runs on it, as there is the Caramel project to replicate it (https://caramel.run/). One of the Erlang creators also ported Prolog to the BEAM (erlog), as well as Lua (erlua) and Lisp (LFE). Elixir is probably great, as it is inspired by Ruby (I found Ruby very pleasant, other languages have so much semantic noise).

Freebie! The BEAM inspired an inspirational design for parallel programming, the Pony language. I am somewhat sad development slowed down, it is a Rust killer.

[–] MonkderVierte@lemmy.zip 3 points 3 days ago

₹ = Indian Rupee, in case anyone is wondering.

[–] somegeek@programming.dev 2 points 3 days ago* (last edited 3 days ago)

Clojure is simple, is a lisp (huge plus since they are super simple and you gain access to a whole realm of languages), and practical. You can do anything from backend to frontend dev with it, and the philosophy and community are lovely.

Scheme is less practical but easier to start with.

Haskell is the least practical but isdefinitely beautiful and helps you understand things better.

[–] thingsiplay@beehaw.org 4 points 4 days ago

I think it doesn't matter in what language you start, as long as it is the paradigm you are learning. You can still pick and choose the language later. Maybe start with a pure functional language, just to learn its concepts. Haskell comes to mind, but it kind of is not the best usable language in every day programming; its more academical nature in my opinion. I personally find Closure also interesting, but I'm not the biggest Java fan at all. At least the language is for practical usage.

[–] lime@feddit.nu 2 points 3 days ago

gleam feels cozy.

[–] cockmushroom@reddthat.com 1 points 3 days ago

I've only used one, and I'm only mentioning it since nobody else has, but I recommend Lean; moreso as a second functional language if you want to build stuff as opposed to just learn the paradigm. It's mostly used in maths because it supports dependent types, but it was fine for writing simple scripts, and it can be easily compiled to binary formats. I don't like the package management system and toolchain complexity, but most languages kinda suck at that, imo.

[–] calcopiritus@lemmy.world 2 points 4 days ago* (last edited 4 days ago) (1 children)

Rust is not fully functional. But I am legally obligated to recommend it any time I can.

Jokes aside, this doesn't apply to you, since you seem to actively learn functional programming. But for people that are scared of it, rust looks like "normal" languages, but has tons of features that can be attributed to functional programming. Even more so if you avoid using references. You can easily "mutate" objects the functional way, by passing the object to the function, and the function creates a new object with just some value changed.

It has algebraic data types. Function pointers. Iterators. Pattern-based match statements. Don't have class inheritance. Inmutable by default. Recursion. Monads. And probably other FP features that I'm missing.

It has basically every functional feature while having familiar syntax.

It's also extremely easy to install. Which I didn't use to appreciate, but then I tried to learn OCaml and had to give up because I couldn't set up a proper dev environment on windows.

[–] azolus@slrpnk.net 5 points 4 days ago* (last edited 4 days ago) (1 children)

Rust certainly is an interesting language and very worth learning but, as you already pointed out, can hardly qualify as functional. It has some functional features and a rich type system for sure, but the way you solve problems in rust is mostly just imperatively and very different from the "FP-way" imo. If OP wants to get into FP specifically, I'd suggest picking a different language first.

On another note: Not quite sure why you're saying OCaml ist hard to install, since the setup has been incredibly easy for me. Maybe the process has changed lately (they've been working on improving the tooling with opam and dune) but you can just follow the official installation instructions under https://ocaml.org/install and get it running in like 5 mins. If that doesn't work, there's always wsl.

Personally I'd suggest OCaml, as it's a statically typed, expressive and pragmatic language with a decently sized and mature ecosystem. For learning resources there's the wonderful Cornell book. Elixir is another hot contender and a pleasure to work with, as others have already pointed out. Pick Haskell if you're interested in getting freaky later on and have built some foundational knowledge (personally I enjoyed the haskell mooc but there are other great resources like learn you a haskell for great good too).

[–] calcopiritus@lemmy.world 2 points 3 days ago

It was years ago. So I don't remember what exactly the problem was.

I believe ocaml has a shell interpreter and a compiler right? I managed to get the shell interpreter to work, but I couldn't get one of these to work:

  • Compiler
  • LSP

The reason I prefer windows is because things just work. But it was a frustration with ocaml. Meanwhile rust was a single command for the compiler, and a single extension install for the LSP.

[–] yaroto98@lemmy.world 2 points 4 days ago (1 children)

I love functional programming and hate object oriented. It's just how my brain thinks, I can and regularly do OOP, but I have to force myself to do it. Why not python? You can do BEAM in python, it's pretty easy to learn, and it's incredibly versatile, and you can program functionally in it too.

[–] azolus@slrpnk.net 1 points 4 days ago

Python has OOP but basically no ergonomic support for FP? It doesn't even support tail recursion or currying, lambdas are very limited and there is no nice way to compose functions. Most of the python ecosystem heavily relies on OOP and in many cases global state. Not hating on python but even compared to other mixed paradigm languages like javascript it's on the less-functional side of things.

[–] NotANick@lemmy.world 2 points 4 days ago

If you’re interested in BEAM anyways, Gleam is just a lovely language to work with. It makes many functional principles easy to work with rather than mathematical. Although I don’t have any experience in Elixir, so I can’t judge how it compares in detail.

[–] kreskin@lemmy.world 1 points 3 days ago

I'd start with logo.

load more comments
view more: next ›