fsharp/fslang-suggestions

Allow `use` with active patterns in Computation Expressions

Swoorup opened this issue · 1 comments

I propose we allow use statements in Computation Expressions. such as follows

type PooledEntry<'a & #IDisposable>(
  entry: 'a,
  pooledSemaphore: SemaphoreSlim
)=
  member _.Entry = entry
  
  interface IDisposable with
    override _.Dispose() =
      entry.Dispose()
      pooledSemaphore.Release() |> ignore


module DeadPool =
  let (|PooledEntry|) (x: PooledEntry<_>) =
    x.Entry
    
  let testPooling () =
    let getConnectionAsync: unit -> Task<PooledEntry<IDbConnection>> = failwith ""
    let getConnection: unit -> PooledEntry<IDbConnection> = failwith ""
    
    task {
      use PooledEntry(entry) = getConnection() // compiles
      let! PooledEntry(entry) = getConnectionAsync() // compiles
      use! PooledEntry(entry) = getConnectionAsync() // compile error
      return ()
    }

The use! PooledEntry(entry) = getConnectionAsync() should compile and should be able to dispose the PooledEntry object when it is out of scope.

The compile error is: error FS0002: This function takes too many arguments, or is used in a context where a function is not expected

The existing way of approaching this problem in F# is
not to use active patterns with use statement in CE at all.

Pros and Cons

The advantages of making this adjustment to F# are

  • Uniform and consistency in both CE or non-CE versions.

The disadvantages of making this adjustment to F# are

  • Additional work for the lang team

Extra information

Estimated cost (XS, S, M, L, XL, XXL):
M

Affidavit (please submit!)

Please tick these items by placing a cross in the box:

  • This is not a question (e.g. like one you might ask on StackOverflow) and I have searched StackOverflow for discussions of this issue
  • This is a language change and not purely a tooling change (e.g. compiler bug, editor support, warning/error messages, new warning, non-breaking optimisation) belonging to the compiler and tooling repository
  • This is not something which has obviously "already been decided" in previous versions of F#. If you're questioning a fundamental design decision that has obviously already been taken (e.g. "Make F# untyped") then please don't submit it
  • I have searched both open and closed suggestions on this site and believe this is not a duplicate

Please tick all that apply:

  • This is not a breaking change to the F# language design
  • I or my company would be willing to help implement and/or test this

For Readers

If you would like to see this issue implemented, please click the 👍 emoji on this issue. These counts are used to generally order the suggestions by engagement.

Don commented on allowing arbitrary patterns in use/use! here — #881 (comment) — where he also suggested opening a new suggestion for arbitrary patterns, so I guess this can serve as that.