6.6 Declared vs. Undeclared Functions

If you declare the type of a function, you can apply it to any data that can be converted to the source type of the function.

Define f with type {\sf Integer → Integer}.

f(x: Integer): Integer == x + 1
Function declaration f : Integer -> Integer has been added to
   workspace.

Type: Void

The function f can be applied to integers, ...

f 9
Compiling function f with type Integer -> Integer
\[\]
10

Type: PositiveInteger

and to values that convert to integers, ...

f(-2.0)
\[\]
-1

Type: Integer

but not to values that cannot be converted to integers.

f(2/3)
Conversion failed in the compiled user function f .

Cannot convert from type Fraction Integer to Integer for value
2
-
3

To make the function over a wide range of types, do not declare its type. Give the same definition with no declaration.

g x == x + 1

Type: Void

If x+1 makes sense, you can apply g to x.

g 9
Compiling function g with type PositiveInteger -> PositiveInteger
\[\]
10

Type: PositiveInteger

A version of g with different argument types get compiled for each new kind of argument used.

g(2/3)
Compiling function g with type Fraction Integer -> Fraction Integer
\[\]
53

Type: Fraction Integer

Here x+1 for x=”axiom” makes no sense.

g("axiom")
There are 11 exposed and 5 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)
                                String
                            PositiveInteger

   Perhaps you should use "@" to indicate the required return type,
   or "$" to specify which version of the function you need.
AXIOM will attempt to step through and interpret the code.
There are 11 exposed and 5 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)
                                String
                            PositiveInteger

   Perhaps you should use "@" to indicate the required return type,
   or "$" to specify which version of the function you need.

As you will see in Chapter ugCategories FriCAS has a formal idea of categories for what makes sense.