anchor.diff:      | Shape.KeyValuePair s ->
           s.Accept { new IKeyValuePairVisitor<unit -> 'T> with
               member __.Visit<'K,'V>() = 
  -                let kt,vt = mkEmptyFunc<'K>(), mkEmptyFunc<'V>()
  -                wrap(fun () -> new KeyValuePair<'K,'V>(kt(),vt())) }
  +                let ke,ve = mkEmptyFunc<'K>(), mkEmptyFunc<'V>()
  +                wrap(fun () -> new KeyValuePair<'K,'V>(ke(),ve())) }
   
       | Shape.FSharpRecord s as ts ->
           let mkEmptyField (p : PropertyInfo) =
  
positive.code:                 let fieldCtors = s.Properties |> Seq.map mkEmptyField |> Seq.toArray
                  wrap (fun () -> fieldCtors |> Array.map (fun f -> f ()) |> s.ConstructorInfo.Invoke :?> 't) }
  
      | _ -> failwithf "Type '%O' does not support empty types." typeof<'T>
  
  and empty<'T> = mkEmptyFunc<'T> () ()
  
  
negative.code:             member __.Visit<'t1,'t2,'t3> () =
                  let et1,et2,et3 = mkEmptyFunc<'t1>(), mkEmptyFunc<'t2>(), mkEmptyFunc<'t3>()
                  wrap(fun () -> et1 (), et2(), et3()) }
  
      | Shape.Tuple4 s ->
          s.Accept { new ITuple4Visitor<unit -> 'T> with
              member __.Visit<'t1,'t2,'t3,'t4> () =
                  let et1,et2,et3,et4 = mkEmptyFunc<'t1>(), mkEmptyFunc<'t2>(), mkEmptyFunc<'t3>(), mkEmptyFunc<'t4>()
                  wrap(fun () -> et1 (), et2(), et3(), et4()) }
  
      | Shape.FSharpOption s ->
          s.Accept { new IFSharpOptionVisitor<unit -> 'T> with
  