mmport80

mmport80

I have an intuitive understanding of behaviours and protocols of course, but after talking with a colleague today, I was surprised that behaviours and protocols are kind of the same thing.

Mainly because protocols are like type classes in Haskell, and if I squint, behaviours are also.

Which you know, is comforting, as I always like seeing links between data (protocols) and code / actions (behaviours).

But, where am I going wrong?

Can anyone explain these Elixir concepts in terms of Haskell, maybe a bit more precision will show me where I am going wrong..

Could I create a GenServer protocol? Or is that completely ridiculous?

I see a related link which is interesting: Why is Access a behaviour instead of a Protocol? When to use a Protocol instead of a Behaviour? - #2 by michalmuskala

Showing Posts 1 to 7

NobbZ

NobbZ

A “behaviour” defines an API that a module has to provide.

A “protocol” is implemented on top of behaviours and chooses from a set of modules to use when dispatching function calls with data, based on their “type”.

11
Post #1
peerreynders

peerreynders

I see the intent behind either as being quite different. However historically OO has often conflated the notion of polymorphism and implementation inheritance - so it would be very easy to fall into the same trap.

  • Protocols are ultimately about polymorphism. One part is the interface that will give access to the same polymorphic behaviour. Then each data type wishing to expose that behaviour implements it separately.
  • Behaviours are about separating the generic implementation from the specific. A Behaviour captures the common implementation for reuse and uses callbacks to invoke the specific implementation (i.e. the part that varies - a Behaviour acts more like a framework).

Erlang OTP Design Principles: 1.2 Behaviours:

In OO the callback module would likely be implemented as a Strategy.

From a development perspective you are implementing an interface and you are implementing a callback module but that is focussing on the “what you are doing” and the “how you are doing it”.

The “why you are doing it” is quite different.

19
Post #2
rvirding

rvirding

Creator of Erlang

To complement a bit on what @peerreynders wrote. In OTP behaviours are generally coupled to processes in that it is around a process where the generic and specific are defined. The generic typically describes the basic process interface and the specific which callbacks are required and when and how they are called/used. So for example a GenServer is a process with a defined interface and a set of 6 callbacks.

jeremyjh

jeremyjh

I think it is also worth pointing out that Behaviours are inherited from Erlang, whereas Protocols are unique to Elixir. In my mind Behaviours are more comparable to interfaces in languages like Java and C#, and Protocols are more like Haskell type classes, except they cannot be polymorphic only in the return type like they can be in Haskell. I don’t think its possible to implement mempty for example.

AleksandarFilipov

AleksandarFilipov

This talk helped me a lot on the topic.

Maybe you’ll find it as useful as i did.

OvermindDL1

OvermindDL1

That is why something like Enum.into/1 takes an argument that defines the type of the return (and why not ‘merge’ it since it is basically free at that point anyway).

mmport80

mmport80 OP

Just back from holidays, thanks for all the replies! Each one thoughtful and thought provoking.

And why this place is one of the best places on the internet!

I found a nice blog post which explains Behaviours to me in terms of Java’s interfaces and Haskell’s records:

It’s an extremely circuitous way to understand Behaviours on an Elixir forum, but Haskell’s precision helps me.

— All posts loaded —

Where Next? Top

Trending in Discussions Top

budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
axelson
Hi there! :wave: @frigidcode and I (but mostly him) have been running an Elixir Book club, we’re almost done with Designing Elixir Syste...
New
achempion
I’ve been using Emacs as my main code editor for more than a two years. It’s a custom build version although I’ve tried doom emacs and sp...
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New
jtormey
Lately I’ve been thinking about how to organize components as a LiveView application grows. One of the pain points I’ve found (for myself...
New
Null-logic-0
What IDE or editor are you using for Elixir development? Personally, I use Zed, and I really like it, but sometimes I wish there were a ...
New

Other Trending Topics Top

KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
OndrejValenta
(I just needed to vent somewhere and LinkedIn is full of hope, or hype, I’m not sure which exactly) AI dream has many faces, but general...
New
CodeSync
Code BEAM Europe 2026 – Call for Talks is Open! We’re excited to announce that Code BEAM Europe 2026 is now open for talk submissions :t...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews