Arrow notation vs RebindableSyntax

Nicolas Frisby nicolas.frisby at gmail.com
Thu Mar 13 21:36:54 UTC 2014


The 7.8-rc2 User Guide for rebindable syntax includes:

Arrow notation (see Section 7.16, "Arrow notation ") uses whatever arr,
> (>>>), first, app, (|||) and loop functions are in scope. But unlike the
> other constructs, the types of these functions must match the Prelude types
> very closely. Details are in flux; if you want to use this, ask!


I want to use this: my types for the functions apparently do not match the
Prelude types closely enough.

Whom should I ask about this?

Thanks very much.

-Nick

----- Further Context

If I do something similar with Monad and RebindableSyntax, it type-checks.

I'm doing some experimentation for work. I'd like to index my arrows as
follows.

(Disclaimer: I have not yet considered any of the laws; I do not currently
intend to support `app' and |||.)

infixr 1 >>>, <<<

type family (:*:) (i :: Maybe *) (j :: Maybe *) :: Maybe *
type instance Nothing :*: j = j
type instance i :*: Nothing = i
type instance Just i :*: Just j = Just (i,j)

returnA :: IArrow arr => arr Nothing a a
 returnA = arr id

-- second, ***, and &&& can have the standard default definitions

class IArrow (arr :: Maybe * -> * -> * -> *) where
    arr :: (b -> c) -> arr Nothing b c
    (>>>) :: arr i a b -> arr j b c -> arr (i :*: j) a c
    first :: arr i b c -> arr i (b,d) (c,d)

Unfortunately, the following does not type-check with -XArrows and
-XRebindableSyntax.

diagram :: IArrow arr => arr f x fx -> arr g x gx -> arr (f :*: g) x gx
diagram f g = proc x -> do
  fx <- f -< x
  gx <- g -< x
  returnA -< gx

The error messages indicate that the type-checker is attempting to unify
the types of f, g, returnA, and the entire proc block.

However, the copy-and-pasted desugaring of that code *does* type-check (mutatis
mutandi).

This S data type is an example of an IArrow.

data S i a b where
  SN ::      ( a    ->  b   ) -> S Nothing  a b
  SJ :: s -> ((a,s) -> (b,s)) -> S (Just s) a b

In terms of the S type, the objective of IArrow is to allow each "box in
the diagram" to have its own state.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/ghc-devs/attachments/20140313/69b04496/attachment.html>


More information about the ghc-devs mailing list