title: currying of 'flexible types' in F#
body: <p>Small part of a code to highlight the problem:</p>
  
  <pre><code>open System.IO
  
  let do_smth i (stm : #System.IO.Stream) =  // val do_smth : 'a -&gt; #Stream -&gt; unit
      (*....*)
      ()
  
  type SomeOps = SomeOps with
      static member op (i : int) = do_smth i
  
  let test_currying i = do_smth i            // val test_currying : 'a -&gt; (Stream -&gt; unit)
                                             // NB: Stream, not #Stream
  let main() = 
      use stm = new System.IO.MemoryStream()
      test_currying 42 stm  // OK, upcasted to Stream somehow
      SomeOps.op 42 stm     // compiler error!
  </code></pre>
  
  <p>Can someone explain, why is compiler's behavior so different in last two lines? And why we lost information (about flexible <code>#Stream</code>) in <code>test_currying</code> function?</p>