anchor.diff:          s.Accept { new IFSharpUnionVisitor<Parser<'T>> with
               member __.Visit (shape : ShapeFSharpUnion<'Union>) =
                   let mkUnionCaseParser (case : ShapeFSharpUnionCase<'Union>) =
  +                    let caseName = pstring case.CaseInfo.Name
                       let init = delay case.CreateUninitialized
  -                    let fps = case.Fields |> Array.map mkMemberParser
  -                    let composed = combineMemberParsers init fps (token ",")
  -                    let paren = between (token "(") (token ")") composed
  -                    pstring case.CaseInfo.Name >>. paren
  +                    match case.Fields |> Array.map mkMemberParser with
  +                    | [||] -> caseName >>. init
  +                    | fps ->
  +                        let composed = combineMemberParsers init fps (token ",")
  +                        let parenP = paren composed
  +                        let valueP = 
  +                            if fps.Length = 1 then attempt parenP <|> composed
  +                            else parenP
  +
  +                        caseName >>. valueP
   
                   let unionParser =
                       shape.UnionCases 
  
positive.code:                 let init = delay shape.CreateUninitialized
                  let eps = shape.Elements |> Array.map mkMemberParser
                  let composed = combineMemberParsers init eps (token ",")
                  wrap(between (token "(") (token ")") composed) }
  
      | Shape.FSharpRecord s ->
          s.Accept { new IFSharpRecordVisitor<Parser<'T>> with
  
negative.code:         fold (fun d i -> i d) init injectors separator
  
      match TypeShape.Create<'T>() with
      | Shape.Unit -> wrap(paren spaces)
      | Shape.Bool -> wrap(stringReturn "true" true <|> stringReturn "false" false)
      | Shape.Byte -> wrap(puint8)
      | Shape.Int32 -> wrap(pint32)
  