Composition is the act of taking a stack and a function, and producing the type signature of the resulting stack. It can also be equivalenty seen as the composition of two functions' execution.
- Generate constraints from the stated type sigs of your functions.
- Match the RHS of the LHF, and the LHS of the RHF, from right to left. If the two symbols are:
- Base types: Fail if one is not a parent type of the other. Otherwise, do nothing.
- Both function types: Recursively generate constraints, starting with
{a} = {b}and expanding the functions using the rule{--} ==> {a -- a}until one constraint set successfully unifies. - One is a variardic type: Recursively generate constraints, starting with
a =and epanding the constraint to capture more values on the other side until one constraint set successfully unifies. - Else: generate a constraint
a = band move on.
- Return the result of the first unification that succeeds.
If you unify
a -- b xandc x -- d, wherexis the matched portion andb/care unmatched ones, you getc a -- b d. Note that eitherborcmust be empty because of how matching works.