This following shows that functions in Axiom have types and a domain for functions may be associated with an identifier.
fricas
(1) -> dom:=(INT->INT)
Type: Type
fricas
f:dom
Type: Void
fricas
f x == x-1
Type: Void
However, when the function is compiled, the returned type displayed may not agree with its declared type or even its apparent compiled type and depends on the input!
fricas
f 3
fricas
Compiling function f with type Integer -> Integer
fricas
f(-3)
Type: Integer
This has nothing to do with the declaration of f
.
fricas
f(x:INT):INT==x-1
Function declaration f : Integer -> Integer has been added to
workspace.
Compiled code for f has been cleared.
1 old definition(s) deleted for function or rule f
Type: Void
fricas
f(3)
fricas
Compiling function f with type Integer -> Integer
fricas
f(-3)
Type: Integer
Not even:
fricas
f(x:INT):INT==(x-1)::INT
Function declaration f : Integer -> Integer has been added to
workspace.
Compiled code for f has been cleared.
1 old definition(s) deleted for function or rule f
Type: Void
fricas
f(3)
fricas
Compiling function f with type Integer -> Integer
fricas
f(-3)
Type: Integer
Or even:
fricas
g(x:INT):NNI == 2^(sign(x)*x)::NNI
Function declaration g : Integer -> NonNegativeInteger has been
added to workspace.
Type: Void
fricas
g 3
fricas
Compiling function g with type Integer -> NonNegativeInteger
fricas
Compiling function G0 with type Integer -> Boolean
The following deliberate "error" shows the Interpreter always assumes 3
is of type PositiveInteger
.
fricas
f 3
fricas
f -3
There are 9 exposed and 6 unexposed library operations named -
having 2 argument(s) but none was determined to be applicable.
Use HyperDoc Browse, or issue
)display op -
to learn more about the available operations. Perhaps
package-calling the operation or using coercions on the arguments
will allow you to apply the operation.
Cannot find a definition or applicable library operation named -
with argument type(s)
FunctionCalled(f)
PositiveInteger
Perhaps you should use "@" to indicate the required return type,
or "$" to specify which version of the function you need.
Compare the type returned below for g 1
, the retraction to PositiveInteger
is not done.
fricas
g(x:INT): FRAC INT == 1/x
Function declaration g : Integer -> Fraction(Integer) has been added
to workspace.
Compiled code for g has been cleared.
1 old definition(s) deleted for function or rule g
Type: Void
fricas
g 1
fricas
Compiling function g with type Integer -> Fraction(Integer)
Type: Fraction(Integer)
The difference may perhaps be due to the fact that the data structure of FRAC INT
is very different from INT
, whereas the data structure of INT
is identical to that of PI
. So the explanation that the reason 1/1
is not retracted because retract
is not always possible is not the full story.
Status: open => rejected
The report is confused.
There is a distinction between
function's declared type (which does not
change),
and the type inferred by the interpreter for
the value computed by a function.
These are two separate processes.