Gradient/Gradualizer would do much better! I’m not sure how complete it is but I’m quite excited for it. Looks great.
It’s more of a type checker or compiler feature than a library. The nice thing about it is that for just inferring and restricting effects you don’t need to change the code at all.
Here’s some normal Elixir code
defmodule Main do
def main do
text = IO.gets("What's your name?")
IO.puts("Hello, " <> name)
end
end
Here it is with an IO monad
defmodule Main do
def main do
IOMonad.pure(fn -> IO.gets("What's your name?") end)
|> IOMonad.map(fn name -> IO.puts("Hello " <> name) end)
|> IOMonad.unsafe_perform_io()
end
end
And here it is with algebraic effects.
defmodule Main do
def main do
text = IO.gets("What's your name?")
IO.puts("Hello, " <> name)
end
end
There’s no changes from the normal code to use IO with this system! All you need to do is annotate functions with any effects they emit.
defmodule MyApp do
@effects [:console]
def print_string(string) do
IO.puts(string)
end
@effects [:send_message, :receive_message]
def run do
send(self(), "Hello")
receive do
x -> x
end
end
end
Any functions that call these functions will automatically be detected as also having these effects.
They will be approximately the same. A gradual type system with full annotations should be as sound as Gleam’s type system (with or without annotations) though it comes down to the details of Gradualizer specifically.
Thank you for your support
The Gleam discord server is often a good place to chat about Gleam or to ask questions. It is quite active these days