Last active
December 5, 2022 00:02
-
-
Save martinos/9fbc6ed057b3fcef7e4aefcc19b5b419 to your computer and use it in GitHub Desktop.
Monoid examples in elixir
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
defmodule Monoid do | |
defmacro __using__(_opts) do | |
quote do | |
def concat([head|tail]) do | |
append(head, concat(tail)) | |
end | |
def concat([]) do | |
empty | |
end | |
end | |
end | |
end | |
defmodule Sum do | |
use Monoid | |
def empty do | |
0 | |
end | |
def append(a,b) do | |
a + b | |
end | |
end | |
defmodule Product do | |
use Monoid | |
def empty do | |
1 | |
end | |
def append(a,b) do | |
a * b | |
end | |
end | |
defmodule Any do | |
use Monoid | |
def empty do | |
false | |
end | |
def append(a,b) do | |
a || b | |
end | |
end | |
defmodule All do | |
use Monoid | |
def empty do | |
true | |
end | |
def append(a,b) do | |
a && b | |
end | |
end | |
defmodule StringMonoid do | |
use Monoid | |
def empty do | |
"" | |
end | |
def append(a,b) do | |
a <> b | |
end | |
end | |
defmodule ListMonoid do | |
use Monoid | |
def empty do | |
[] | |
end | |
def append(a,b) do | |
Enum.concat([a,b]) | |
end | |
end | |
defmodule MapSetMonoid do | |
use Monoid | |
def empty do | |
MapSet.new | |
end | |
def append(a,b) do | |
MapSet.union(a,b) | |
end | |
end | |
defmodule MapMonoid do | |
use Monoid | |
def empty do | |
%{} | |
end | |
def append(a,b) do | |
Map.merge(a,b) | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment