On Sun, Dec 24, 2023 at 09:48:07PM -0800, 'Nasser M. Abbasi' via FriCAS -
computer algebra system wrote:
> I am learning little Fricas. But confused about this
>
>
> (21) -> g2(x: Integer): Integer == x^2
> Function declaration g2 : Integer -> Integer has been added to
> workspace.
>
> Is the above function supposed to accept only Integer type as input and
> return Integer? Then why does this call work:
>
> 22) -> g2(7.0)
> Compiling function g2 with type Integer -> Integer
> (22) 49
> Type:
> PositiveInteger
>
> It seems to have casted 7.0 to 7? And should not the type returned be
> Integer and not PositiveInteger?
>
> 23) -> typeOf(7.0)
> (23) Float
>
> Fricas does however catch the error when passing string:
>
> 24) -> g2("hello")
> Conversion failed in the compiled user function g2 .
> Cannot convert the value from type String to Integer .
>
> Compare to Maple
> -------------------------------------------------
> g2:=proc(x::integer)::integer;
> x^2;
> end proc;
>
> g2(7.0);
> Error, invalid input: g2 expects its 1st argument, x, to be of type
> integer, but received 7.0
> -----------------------------------------------
>
> And that is what I was expecting, given that Fricas is very strongly typed.
>
> Did I do something wrong or do I need to turn some setting on or something?
FriCAS has notion of "coercion", "retraction" and "convertion". There
is a difference between them, but basically FriCAS "knows" that some
functions can be used to change types. In particular, FriCAS has
'retract' function that can change Float to Integer: it will work only
when Float happens to have integer value, otherwise will fail. In
interactive use, when types do not match FriCAS automatically tries
to inserts convertion functions to ensure type agreement. In effect,
FriCAS treats your 'g(7.0)' as 'g(retract(7.0))'. In similar spirit,
FriCAS tries to show result in narrowest possible type, that is why it
prints 'PositiveInteger'.
Note: On command line FriCAS tries very hard to change types so
that expression can be evaluated. In user defined functions
FriCAS is doing less work, but still inserts convertion like
above. In Spad language FriCAS is insterting only small number
of "obvious" coercions.
This may look not very consistent, but simply having to insert
coercions and convertions everywhere is too inconvenient for
most users, so convenience wins. In Spad you are programming
and for readability supposed to be more explicit. Function
definitions in "interpreter" are an intermediate thing.
Concering user settings: this can not be changed by normal
settings.
--
Waldek Hebisch
--
You received this message because you are subscribed to the Google Groups
"FriCAS - computer algebra system" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/fricas-devel/ZYlxSvDsu4Oou-dI%40fricas.org.