fsharp / fslang-suggestions

The place to make suggestions, discuss and vote on F# language and core library features
341 stars 20 forks source link

Allow `use` with active patterns in Computation Expressions #1357

Open Swoorup opened 2 months ago

Swoorup commented 2 months ago

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

The disadvantages of making this adjustment to F# are

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:

Please tick all that apply:

For Readers

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

brianrourkeboll commented 2 months ago

Don commented on allowing arbitrary patterns in use/use! here — https://github.com/fsharp/fslang-suggestions/issues/881#issuecomment-853807713 — where he also suggested opening a new suggestion for arbitrary patterns, so I guess this can serve as that.