The goal is to remove all overhead associated with using Nullable, since we
know at compile time what path (in the if branch) will result in None vs
Some. Since we know this, we can simply inject `function2` into
`function1`. However, we have an issue that `function2 ` requires the
variable `z`.
I found Monad.jl but it is out of date and does not optimize the right way.
In fact, it uses so many deeply nested anonymous functions that the
performance suffers vs other approaches.
I am looking for something that would optimize this:
function function1(a, b)
if(a > b)
c = a + b
d = a - b
return (c, d)
else
# do anything
# but return nothing
end
end
function function2(c, d, z)
return c + d + z
end
a = 1
b = 2
z = 10
@mdo Maybe begin
(c, d) <- Maybe( function1(a, b) )
res <- function2(c, d, z)
end
Into this:
a = 1
b = 2
z = 10
function1(a, b, z)
function function1(a, b, z)
if(a > b)
c = a + b
return function2(c, d, z)
else
# do anything
# but return nothing
end
end
Notice how `function2` was inserted, and also how `function1` has the `z`
variable added to its parameters. But again, what is the limit on adding
variables to the parameters? And it looks efficient to me, but is it
really?
This saves us the overhead of using `Nullable{T}`. And it is an
optimization we can do at parse time.
**Option 1**: So we could create a function with z already filled in, but
this would result in the generation of many different functions, for
different values of z.
**Option 2**: Or we can use Nullable, and safely parse the result, but this
also introduces unnecessary overhead.
**Option 3**: Can use macros, but firstly what is the limit on function
parameters? Secondly, is there a better way?
I really like the Monad comprehension syntax, its probably the best way to
describe what we want to do.
Any equivalent of this optimization would be nice, maybe something using
anon funs, but done correctly.