Skip to content

Add List.chooseV, Seq.tryPickV, etc. for ValueOption #739

@cmeeren

Description

@cmeeren

Add List.chooseV, Seq.tryPickV, etc. for ValueOption

I propose we add ValueOption equivalents of the following functions:

  • List.choose / Seq.choose / Array.choose / Event.choose / Observable.choose
  • List.pick / Seq.pick / Array.pick / Map.pick
  • List.tryPick / Seq.tryPick / Array.tryPick / Map.tryPick
  • List.unfold / Seq.unfold / Array.unfold

(For the sake of completeness: Additional functions in these modules that could be implemented too are all the tryX functions that only return an option, but in this suggestion, I choose to concentrate only on the above since they allocate N objects instead of 1).

The existing way of approaching this problem in F# is... none, really, apart from writing low-level implementations similar to what would go into FSharp.Core.

Pros and Cons

The advantages of making this adjustment to F# are:

  • Increased performance, since we can use choose and pick semantics without N allocations
  • Allows later replacing F# internal Option-based usages (of choose etc.) with ValueOption-based (chooseV etc.) for likely increased performance
  • Better feature parity with option

The disadvantages of making this adjustment to F# are:

  • Added function bloat (I'd say that for these N-allocating functions it's worth it)

Extra information

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

Related:

Affidavit (please submit!)

Please tick this 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
  • I have searched both open and closed suggestions on this site and believe this is not a duplicate
  • 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.

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions