Operators are functions that take two arguments and are called with the name of the function between its arguments, as in `4 Nat.* 3`

. We call this kind of syntax, "infix notation". You can write your own operators in Unison with a few special syntax conventions.

Operator names in Unison can only be comprised of the characters `!$%^&*-=+<>~\\/|:`

. So `==>`

is a valid operator name but `=hi!>`

is not.

You can wrap your operator in parenthesis followed by two arguments to define it.

`(^) x y = Nat.pow x y`

Or you can define the operator with the symbols between its arguments:

`x ^ y = Nat.pow x y`

Without the parenthesis or infix definition, the UCM would fail to parse `^`

as a valid function definition.

Calling these functions can be done with the infix notation, `2 ^ 3`

, or with the regular function application syntax, `^ 2 3`

.

You might want your operator to be prefixed with a namespace so it's located in a specific place in your codebase. Prepend the namespace inside the parentheses:

`(aNamespace.^) x y = Nat.pow x y`

Or add it in between the arguments:

`x aNamespace.^ y = Nat.pow x y`