anchor.diff:      abstract member FailureMsgForShould : string
       abstract member FailureMsgForShouldNot : string
   
  -let applyMatcher<'T> (matcher: Matcher<'T>) f (a : 'T) =
  +let applyMatcher<'T,'U> (matcher: Matcher<'T>) f (a : 'T) : 'U =
       matcher.ApplyActual f a
   
   let newCreateFullMatcher<'T> (f : 'T -> MatchResult) (shouldMsg : string) (shouldNotMsg : string) =
  
positive.code:                 a ()
                  MatchFail "No exception thrown"
              with
              | e -> match e.Message |> applyMatcher matcher (MatchResult.apply id) with
                     | true -> MatchSuccess e.Message
                     | false -> MatchFail e.Message
          newCreateMatcher f
              (sprintf "throw exception with message %s" matcher.FailureMsgForShould)
              
  
negative.code:         createFullMatcher f msg notMsg
      
      let length matcher =
          newCreateMatcher 
              (fun a -> a |> Seq.length |> applyMatcher matcher id)
              (sprintf "have length to %s" matcher.FailureMsgForShould) 
  
      let exactly no matcher =
          let f a = a |> Seq.filter (applyMatcher matcher (MatchResult.apply id)) |> Seq.length = no
  