title: Why can't non-partial active patterns be parameterized in F#?
body: <p>The following F# code works as I expected, printing `Matched as 'A':</p>
  
  <pre><code>let (|Char|_|) convf = function
      | LazyList.Nil -&gt; None
      | LazyList.Cons (x, _) -&gt; Some (convf x)
  
  let test = function
      | Char System.Char.ToUpper x -&gt; printfn "Matched as %A" x
      | _ -&gt; printfn "Didn't match"
  
  test (LazyList.of_list ['a'])
  </code></pre>
  
  <p>However, if I change <code>Char</code> from a partial active pattern to a complete active pattern as follows:</p>
  
  <pre><code>let (|Char|NoChar|) convf = function
      | LazyList.Nil -&gt; NoChar
      | LazyList.Cons (x, _) -&gt; Char x
  
  let test = function
      | Char System.Char.ToUpper x -&gt; printfn "Matched as %A" x
      | NoChar System.Char.ToUpper -&gt; printfn "Didn't match"
  
  test (LazyList.of_list ['a'])
  </code></pre>
  
  <p>Then the code fails to compile, giving the following error message: <code>error FS0191: Only active patterns returning exactly one result may accept arguments.</code></p>
  
  <p>This example may look somewhat contrived, but it's a simplified version of an active pattern I tried to use in a Prolog lexer I've been working on in my spare time. I can easily rewrite my code to avoid this problem, but I'm curious about why this sort of code is disallowed.</p>
  
  <p><em>Update:</em> the newer versions of F# seem to have renamed this error:</p>
  
  <p><code>error FS0722: Only active patterns returning exactly one result may accept arguments</code></p>