anchor.diff:  
   type Subst<'p, 'w> = array<'p> -> 'w -> 'w
   
  -type [<AbstractClass;AllowNullLiteral>] ProductS<'e, 'r, 'p, 'w> () =
  +type [<AbstractClass;AllowNullLiteral>] ProductS<'e, 'r, 'cs, 'p, 'w> () =
     abstract Subst: array<'p> * int * byref<'r> -> int
   
   type SumS<'c, 's, 'p, 'w> = SS of list<Subst<'p, 'w>>
  
positive.code:     failwithf "Expected %d elems, but was given %d elems" n ps.Length
  
  let missS ps w = check ps 0; w
  let makeS (m: AsProduct<'r, 'w>) (rs: ProductS<'r, 'r, 'p, 'w>) =
    match rs with
     | null -> missS
     | rs -> fun ps w ->
  
negative.code:             fun w i ps ->
                extE w  i         ps
                extR w (i + numE) ps)
    member g.Product (_: Product<'w>,
                      _: AsProduct<'r, 'w>, r: ProductE<'r, 'r, 'w, 'p, 'w>) =
      makeE r
  
    member g.Case (_: Case<Empty, 's, 'w>) : SumE<Empty, 's, 'p, 'w> =
      SE [missE]
    member g.Case (_: Case<'r, 's, 'w>,
                   r: ProductE<'r, 'r, 's, 'p, 'w>) : SumE<'r, 's, 'p, 'w> =
      SE [makeE r]
    member g.Plus (SE c: SumE<        'c    , Choice<'c, 's>, 'p, 'w>,
                   SE s: SumE<           's ,            's , 'p, 'w>)
  