There are four possible status for a casting function:
implicit The function may be applied implicitly, but we have no information about the relations between the original and the result type.
extension The result is considered to belong to a type which is a superset of the original type. Such a function may be applied implicitly.
reduction The result considered to belong to a type which is a subset of the original type. Such a function may be applied only in an explicit casting in the source code, or in an affectation.
explicit The function may only be used when an explicit casting is found in the source code.
This is the most restrictive and default behavior if none of the previous keywords is found in the body of the function.

When a function call is found in the source code, Pliant compiler can use several implicit or extension casting functions to convert the various arguments.
If several functions can be applied using different casting functions, then one of these must require less casting functions to be applied on each argument, elsewhere the code is considered to be ambiguous and an error is reported. (more details)
In an affectation (a := b), reduction casting functions can also be involved.

This means that in numerical computations, during the intermediate operations, we always cast to the largest of the involved types, and finally cast to the required type at the end (the affectation).

There is no specific notation for implicit casting ... since it's implicit:

var Int i := 3
var Float f := i

On the other hand, explicit casting is forced using 'cast' function:

var Float f := 3
var Int i := cast f Int

The exact syntax for 'cast' function is:

cast value type


The following casting function comes from char.pli an specify how to cast a Char (character) to a Str (string)

function 'cast Str' c -> s
  arg Char c ; arg Str s
  extension
  s := " "
  s 0 := c