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. Also, operators cannot start with a period`.`

because of its special meaning as a namespace delimiter.

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`