===
[Abilities] one line structural ability
===
structural ability Throw e where throw : e ->{Throw e} a

---
(unison
    (ability_declaration
        (structural)
        (ability)
        (ability_name (regular_identifier))
        (type_argument)
        (where)
        (constructor
            (constructor_name)
            (colon)
            (regular_identifier)
            (arrow_symbol)
            (effect
                (regular_identifier)
                (regular_identifier))
            (regular_identifier))))
===
[Abilities] unique ability
===
unique ability Store a where
  put : a ->{Store a} ()
  get : {Store a} a
---
(unison
    (ability_declaration
        (unique)
        (ability)
        (ability_name (regular_identifier))
        (type_argument)
        (where)
        (constructor
            (constructor_name)
            (colon)
            (regular_identifier)
            (arrow_symbol)
            (effect
                (regular_identifier)
                (regular_identifier))
            (unit))
        (constructor
            (constructor_name)
            (colon)
            (effect
                (regular_identifier)
                (regular_identifier))
            (regular_identifier))))
===
[Abilities] optional `unique`
===
ability Store a where
  put : a ->{Store a} ()
  get : {Store a} a
---
(unison
    (ability_declaration
        (ability)
        (ability_name (regular_identifier))
        (type_argument)
        (where)
        (constructor
            (constructor_name)
            (colon)
            (regular_identifier)
            (arrow_symbol)
            (effect
                (regular_identifier)
                (regular_identifier))
            (unit))
        (constructor
            (constructor_name)
            (colon)
            (effect
                (regular_identifier)
                (regular_identifier))
            (regular_identifier))))
