Skip to content

Instantly share code, notes, and snippets.

@martinos
Last active December 5, 2022 00:02
Show Gist options
  • Save martinos/9fbc6ed057b3fcef7e4aefcc19b5b419 to your computer and use it in GitHub Desktop.
Save martinos/9fbc6ed057b3fcef7e4aefcc19b5b419 to your computer and use it in GitHub Desktop.
Monoid examples in elixir
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