anchor.diff:                          | Filter(f,o) -> sprintf "%s |> filter f" (toString o)
                           | MapM(f,o) -> sprintf "%s |> mapM f" (toString o)
                           | ChooseM(f,o) -> sprintf "%s |> chooseM f" (toString o)
  -            
  +                        | UnionWith(f,l,r) -> sprintf "union(%s, %s)" (toString l) (toString r)
  +                        | Choose2(f,l,r) -> sprintf "choose2(f, %s, %s)" (toString l) (toString r)
  +
  +
                   toString x.expression
               member x.Expression = x.expression
               member x.Inputs = x.inputs()
  
positive.code:         { new Arbitrary<simmap<'k, 'v>>() with
              override x.Generator =
                  gen {
                      let case = rand.UniformInt(9)
                      match case with
                          | 0 | 1  -> 
                              let! content = Arb.generate<list<'k * 'v>>
  
negative.code:                             let! input = Arb.generate<simmap<'k, 'v>>
                              let! f = Arb.generate<'k -> 'v -> simmod<Option<'v>>>
                              return SimMap.chooseM f input
  
                          | 9 ->
                              let! l = Arb.generate<simmap<'k, 'v>>
                              let! r = Arb.generate<simmap<'k, 'v>>
                              let! f = Arb.generate<'k -> 'v -> 'v -> 'v>
                              return SimMap.unionWith f l r 
  
                          | 10 ->
                              let! l = Arb.generate<simmap<'k, 'v>>
                              let! r = Arb.generate<simmap<'k, 'v>>
                              let! f = Arb.generate<'k -> Option<'v> -> Option<'v> -> Option<'v>>
                              return SimMap.choose2 f l r 
                              
                          | _ ->
                              return failwith ""
                              
  