  We explore the design and implementation of Frank, a strict functional
programming language with a bidirectional effect type system designed from the
ground up around a novel variant of Plotkin and Pretnar's effect handler
abstraction.
  Effect handlers provide an abstraction for modular effectful programming: a
handler acts as an interpreter for a collection of commands whose interfaces
are statically tracked by the type system. However, Frank eliminates the need
for an additional effect handling construct by generalising the basic mechanism
of functional abstraction itself. A function is simply the special case of a
Frank operator that interprets no commands. Moreover, Frank's operators can be
multihandlers which simultaneously interpret commands from several sources at
once, without disturbing the direct style of functional programming with
values.
  Effect typing in Frank employs a novel form of effect polymorphism which
avoid mentioning effect variables in source code. This is achieved by
propagating an ambient ability inwards, rather than accumulating unions of
potential effects outwards.
  We introduce Frank by example, and then give a formal account of the Frank
type system and its semantics. We introduce Core Frank by elaborating Frank
operators into functions, case expressions, and unary handlers, and then give a
sound small-step operational semantics for Core Frank.
  Programming with effects and handlers is in its infancy. We contribute an
exploration of future possibilities, particularly in combination with other
forms of rich type system.
