fsharp / fslang-suggestions

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

Use of the `_.Property` shorthand in delegates #1308

Closed lucasteles closed 6 months ago

lucasteles commented 1 year ago

I propose we enable to use of the new _.Property shorthand for accessor within Func<> and Expression<Func<>> as normal lambdas

["foo"; "42"; ""] |> List.map _.Length // [3; 2; 0]

open System.Linq
["foo"; "42"; ""].Select(_.Length) // fail

The existing way of approaching this problem in F# is:

Using normal lambdas

["foo"; "42"; ""].Select(fun s -> s.Length) 

Pros and Cons

The advantages of making this adjustment to F# are : make the syntax consistent

The disadvantages of making this adjustment to F# are : N/A

Extra information

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

Related suggestions: https://github.com/fsharp/fslang-suggestions/issues/506

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.

lucasteles commented 1 year ago

cc @vzarytovskii

Happypig375 commented 1 year ago

["foo"; "42"; ""].Select(_.Length) :x: ["foo"; "42"; ""].Select _.Length ✔️

lucasteles commented 1 year ago

@Happypig375 I believe both should work, the first is important to not break the fluent chain

["foo"; "42"; ""].Select(_.Length).Where(isEven)

Happypig375 commented 1 year ago

@lucasteles only needed when there is a fluent chain.

cmeeren commented 1 year ago

This already has an issue: #506

Edit: Oh wait, is this specifically for Func/Expression?

Happypig375 commented 1 year ago

@cmeeren This is for any delegate, not F# function types.

cmeeren commented 11 months ago

Yes, then I definitely second this.

T-Gro commented 11 months ago

This was done as part of https://github.com/dotnet/fsharp/pull/16339 (it is in main, not yet in the released product) The following three syntax options of doing the same now work, does it cover all of this suggestion?

open System.Linq
let _ = [""; ""; ""].Select(fun x -> x.Length)
let _ = [""; ""; ""].Select(_.Length)
let _ = [""; ""; ""].Select _.Length
cmeeren commented 11 months ago

From what I can see, this would fix the issue, though I'm not the OP.

abelbraaksma commented 6 months ago

Works like a charm (in main)!

image