Domain-specific languages may be implemented via an embedding in a
general-purpose language. Functional languages, with their powerful
abstraction and composition mechanisms, are ideal for this purpose.
In effect, each library of combinators defines a new sublanguage.
The categorical notion of monad, used by Moggi to structure
denotational descriptions, has proved to be a powerful tool for
structuring such libraries.
Recently, several workers have proposed a generalization of monads,
called variously ``arrows'' or Freyd-categories. The extra
generality promises to increase the power, expressiveness and
efficiency of the embedded approach, but does not mesh as well with
the native abstraction and application. Definitions are typically
given in a point-free style, which is useful for proving general
properties, but can be awkward for programming specific instances.
In this paper we define a simple extension to the functional
language Haskell that makes these new notions of computation more
convenient to use. Our language is similar to the monadic style,
and has similar reasoning properties. Moreover, it is extensible,
in the sense that new combining forms can be defined as expressions
in the host language.