Ben said:
Can you expand on that? It sounds like you are referring to
linear algebra or other mathematical concepts, but I do not know
how they apply in this situation.
Consider floating point operations. When a floating-point exception is
raised, the corresponding floating-point status flag is set. This is
described as a "side-effect" of exceptional floating-point operations.
So, although conceptually we may perceive these operators as mapping a set
of floating-point values to a floating-point value, they actually map a set
of floating-point values to a tuple formed by a floating-point value and a
fenv_t state. More specifically, instead of performing a map similar to:
{float x, float y} -> operator(x,y) \in {float}
....these operators actually are similar to:
{float x, float y} -> operator(x,y) \in {float, fenv_t}
So, in this example, just because, conceptually, we tend to ignore the
fenv_t type, it doesn't mean it doesn't exist or that it isn't a part of
these operators' co-domain. It does, and although it tends to be swept
under the proverbial rug, it is very much an integral part of the definition
of these floating-point operators.
The same also happens with elements which are a part of an operator's domain
but are ignored by a programmer. If the outcome of an operator depends on
some state then the state that influences this outcome, along with any flag
that might be set in the process, are naturally a part of these operators'
domain and co-domain. Not being aware of these elements or how they
influence the outcome of a computation doesn't mean that there is a hole in
basic algebra or in lambda calculus.
Rui Maciel