Check out a free preview of the full Hardcore Functional Architecture Patterns in JavaScript course

The "Creating Semigroup Data Types" Lesson is part of the full, Hardcore Functional Architecture Patterns in JavaScript course featured in this preview video. Here's what you'd learn in this lesson:

Brian explains how to lift an operation through a type to be able to program an interface.


Transcript from the "Creating Semigroup Data Types" Lesson

>> So semi groups are everywhere, like, everywhere. And so the main thing you have to kind of think about when you're defining a semi group is what if we make this operator this kind of like special operator here and we're going to overload it with plus union intersection, disjunction, conjunction and pretty much any operator.

We can do max and min in the same way with min greater than and less than. So if I said one greater than three greater than seven or zero, whatever, we can do that associatively and it's closed. So semigroups are everywhere. And we're going to define them in programming as a datatype.

So let's do Sum. And we're going to call that special operator, we're just going to have a method because we don't want to do operator overloading in JavaScript. It's a pain in the butt gives like value of tricks and whatnot. So we're going to go ahead and just do it this way.

So if I'm gonna concat a sum with another sum, well let's actually start with what we gonna write so we'll say 3 concat sum of 5, and what we want is the sum eight. Now that's a weird thing to do. [LAUGH] What we're trying to do is make an interface that we're programming to that captures all those examples that I was just talking about with the semi groups.

So we have these binary operators that can be implemented in many different ways and they're associative and closed. We can make an interface on an object and say around a type and just say concat is that operator, right? It concats the thing on the left with the right and it's associative and it's closed, meaning I will always get a sum out if I concat two sums.

So let's go ahead and implement this. Sum we're always going to return a sum and we have to expose this x here. So I can get the x off the other. So we'll say sum x plus other.x, so everybody see how that works. That's a it's a bit of an interesting syntax.

You don't see it very often. With these little factory functions, I just, it's the slimmest way to define this kind of stuff and I just stick with it. But is anybody getting hung up on this? Okay, so we're going to do is hopefully this will say sum of eight, I think monoids zero.

It's not really going to say sum of eight, but x is eight, and it's got a concat. So that's our sum. We can define a two string on it. That would be nice, but let's not go through that. So we can do this with products. Let's go ahead and do this with products.

And that would be just multiplication, right? Instead of plus, cool. So let's change sum to product. Three times five and we should get the products. There we go. Oops products. Sum five. What did I do here? There we go. And there we are. 15 how about let's do any, which is the name for this or that.

So let's say any is x for the other one. I could say any true concat any false. Okay, and so if either of these are true, we'll get an any true and if either, so we can just run that real quick. Get true. They're both false, we'll get false.

This kind of captures that idea of running through an array and seeing if anything is true or false. It combines everything and tells you the answer of if you had a true or false, so we can see we're going to see some of these in action. But I just want you to get a feel for what's happening.

We're lifting this operation into a type so we can program to the interface called concat. And then we can swap these types out. But concat always behaves the same way. Perhaps the interesting the simplest one is just strings. Say hi [LAUGH] concat it's already built in got an explanation.

And bam. We get hi.

Learn Straight from the Experts Who Shape the Modern Web

  • In-depth Courses
  • Industry Leading Experts
  • Learning Paths
  • Live Interactive Workshops
Get Unlimited Access Now