Applicative Notation
Applicative notation makes working with whole models and other “applicative” types more convenient.
Applicative notation is indicated by braces ({}
), and optionally a namespace .N
.
If the namespace is omitted, WholeModel.
is used.
Within applicative notation, “applications” are indicated with percent (%
).
For example:
{.N "example"}
is the same aspure.N "example"
{.N "answer: " ++ %r}
is the same asmap.N (fn v1 => "answer: " ++ v1) r
{.N %x + %(y ?? z)}
is the same asap.N (map.N (fn v1, v2 => v1 + v2) x) (y ?? z)
N
must be a namespace with these names defined: map
, pure
, ap
, liftA2
, **
, >>
.
All of these names will be aliased from N
into the current namespace.
If the names in N
have the appropriate types, then these will be true:
If
expr: T
, then{.N expr}: N +T
.If
n: N {-P,+Q}
orn: N Q
, then%n: Q
within applicative notation for namespaceN
.
When used with the WholeModel
namespace, applicative notation works only with the getting and updating of whole models, and ignores setting.
Using :=
or delete
with whole models created this way will stop (see stop
for what stopping means).
Appropriate namespaces for applicative notation:
WholeModel.
(the default if.N
is omitted)Maybe.
List.
List1.List.
Function.
Either.
Action.
Task.
Drawing.Cairo.