HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
fsharp
fslang-suggestions
Libraries & SDKs2016–2026
fsharp / fslang-suggestions

fslang-suggestions

The place to make suggestions, discuss and vote on F# language and core library features

29Distinct people
31Mentions
1Explicit recommenders
373GitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

The place to make suggestions, discuss and vote on F# language and core library features

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

Just today, Don Syme wrote up thorough explanation on why he won't be adding type classes and more higher-order-types (or whatever the correct term is) to F#. As someone…

wheresmycraisin used a recommendation phrase. One indexed comment matches. This is a phrase match, not a verdict.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

No other repository is repeatedly linked in the same discussions.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 3:56:07 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year31 dated mentions

Observed mentions: 2016-12-10 00:55:16 UTC to 2026-04-08 12:16:16 UTC.

02468102016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments20162017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 10 mentions; 5 submissions, 5 comments20212022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments. Incomplete calendar period.2026*

* An incomplete calendar period is marked with an outlined bar. Its count is not directly comparable with a full period.

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC101
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC000
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC101
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC404
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC404
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC1055
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC303
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC202
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC303
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC202
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC101

From the project README

An excerpt from the repository, fetched Nov 13, 2026.

Read the project’s introduction
Welcome to F# Language and Core Library Suggestions! This repository is for suggestions about the future evolution of the F# Language and Core Library. For discussions about tooling (editor support, compiler services etc.) please see http://github.com/dotnet/fsharp. Voting is by giving 👍 reactions to an issue. The items marked approved-in-principle are eligible to be taken to an RFC in the F# language design repository. You can contribute an implementation for an RFC in the F# development repository. Please search for an existing suggestion before opening a new one. Just use GitHub search over the issues in this repository. View all suggestions View popular suggestions (votes by 👍) View newest suggestions View approved-in-principle suggestions View started suggestions View open suggestions (language) View open suggestions (core library) View completed suggestions View declined suggestions View all archived uservoice suggestions and comments (the comments from that time are linked but it got 404'ed) Create a new suggestion (have you searched for existing similar suggestions?) Notes on the Design Process We do not in general revisit design decisions that have already been decided. In particular there is a distinction between things we have previously decided "not to do" things where we decided to do X, considered Y, and by doing X implicitly decided not to do Y things we thought about doing and left open the future possibility of doing them things we never thought of before Most of the existing open suggestions are in category 3 or 4. In general things in categories 1 and 2 won't be reconsidered unless there is a really very strong case, e.g. because of a change in circumstance. Many suggestions will thus be closed with responses like "we considered this in F# 2.0 and decided against this". The design notes for F# 2.0-3.0 are only available in email form, we will gradually try to make them available from our archives. The decisions about moving things to "approved in principle" (and thus RFC stage) are up to the F# Language Design squad. These are currently Don Syme Vlad Zarytovskii Tomas Grosup Where necessary Don Syme will act as final decision maker. This squad is just people who have the right to label issues - putting that aside everyone should please consider themselves equal contributors. We are open to diversifying this squad further, please see this note from Don Syme. Votes are just used as an indicator. A huge range of factors go into the decision to "approve in principle", including: estimated utility estimated cost of implementing completeness of proposed design (is this an "idea" or a concrete suggestion) availability of alternatives education/learning paths and simplicity whether this gives multiple ways to achieve the same thing votes design coherence "less is more" design considerations likelihood of breaking change strategic importance usefulness (or otherwise) for interop with .NET and other languages risk of churn w.r.t. bugs cost of churn w.r.t. education materials (new editions of books etc.) whether someone is willing to step up to the plate to write an RFC, implement the change and own it long term Also we have a large queue of relatively small-cost "approved in principle" items, and a large (and occasionally growing) number of bugs/issues in http://github.com/dotnet/fsharp. Getting through these is also a priority. When are new features a good thing? Adding endless new language features in every version has major downsides. Here are some observations on why adding features is not necessarily a good thing: Stability is a virtue Gradual evolution is good Adding new language features on every version is not a necessarily a sign of strength. Many languages have spread very widely while remaining very stable (e.g. Java in 2000-2013) The addition of new features on every version can be a sign that language implementors are being incentivized (e.g. getting paid) for feature-completion rather than overall simplicity and utility. New features add learning costs to every user of the language In contrast, features which make the language more orthogonal, simpler and easier to use are generally a very good thing. What about optional features? There's a strong bias in the language design (and likewise in many other language designs) against optional features which effectively turn the language into a slightly different language ("bifurcate the language"). There are many social reasons for avoiding such optional features - e.g. when you code review code, or have two programmers meeting in a team and having to decide on standards - it's one thing to have to decide on coding conventions and design idioms, it's another to have to turn the knobs and dials on the language to select what's allowed. For this reason making a feature optional will generally not used as an approach, though exceptions may be made in some cases (e.g. checked arithmetic is optional in both F# and C#). How do I get my favourite feature approved? First make sure the issue for your feature is really clear and addresses all major concerns. Probably the best thing you can do to get a feature promoted is to draft an RFC on it, even if it has not yet been marked "approved". A prototype implementation of high quality, with tests, can also help convince. Code of Conduct This repository is governed by the Contributor Covenant Code of Conduct. We pledge to be overt in our openness, welcoming all people to contribute, and pledging in return to value them as whole human beings and to foster an atmosphere of kindness, cooperation, and understanding. We additionally request that the use of the personal pronon "you" (referring to a specific person) should be minimized in discussions. The use of the word is common, and often doesn't refer to an individual, but an effort should please be made to make technical points in a non-personal way, addressing the technical matter, rather than the person. A simple techniqu
Read the full README on GitHub

What Hacker News says

31 sources
I've written patches for F#. I do know what the hell I'm talking about. However, the compiler does not, has never, required that it does things via a different syntax. In fact, in the early branches before that was adopted, it didn't! The same behaviour was seen in those branches. This behaviour you expect, was never something that had to be. It was something chosen to simplify the needs of the optimiser, and in fact cut the size of code required in half. It was to reduce the amount of code needed to be maintained by the core team. And so 1087 [1] was accepted. So perhaps you might need to read more into the process of the why and how async was introduced into C# and F#. It was a maintenance team problem. It was a pragmatic approach for them - not something that was the only way that this became a possibility. As said, in the original bra
Read the rest
nch for using tasks... > Having two different but similar ways of creating asynchronous computations would add some cognitive overhead (even now there are times when I am indecisive between using async or mailbox for certain parallelism/concurrency scenarios). [0] [0] https://github.com/fsharp/fslang-suggestions/issues/581 [1] https://github.com/fsharp/fslang-design/blob/main/FSharp-6.0...
In OCaml Syntax Sucks (2016)
You mostly have to look at the time frames between C# adding features with new ABIs and the time it takes for F# to announce they can actually consume them. For example, F# used to crash the CLR with InvalidProgramException when setting C# `init` properties. [1] It took almost three years, I think, to release the fix. [1]: https://github.com/fsharp/fslang-suggestions/issues/904 Another rough example would be spans, and their more general feature, byref-like types (ref struct). These required plenty of compiler support, as they've got special lifetime rules (and more pending to implement `scoped`), they are banned as generic type arguments, and they require ignoring a special Obsolete attribute. While these were added to F# timely, many language features still break when they interact with them: local functions, computation expressions (ev
Read the rest
en the built-in ones), recursive type inference, and generic intrinsic methods such as `raise`, `defaultof` or `typeof`. This wouldn't be so bad if C# hadn't "spanified" the shared framework and the entire ecosystem without CLS alternatives for many APIs. So, these natural F# snippets don't compile: let numbers = [| for span in text.EnumerateLines() -> Int32.Parse span |] let checkNonEmpty (span: ReadOnlySpan<'T>) = if span.Length > 0 then span else failwith "Expected non-empty span." Edit: And I haven't even gotten into the libraries that use reflection expecting you to declare types in ways F# doesn't support.
In Official proposal for Type Unions in C#
> But net/net, when a GHC contributor rolls up his or her sleeves, they on average have a bigger range than people who argue about ReactJS vs Ember. In my experience when exposed to dynamically typed languages, they will argue endlessly on "how bad they are". Also proponents of strongly type systems are often incapable of recognizing the drawbacks of such systems. See for example https://github.com/fsharp/fslang-suggestions/issues/243#issu... for a critique that is never expressed by Haskellers.
In I would like a job writing Haskell
Nice article! Highly related discussions: https://github.com/fsharp/fslang-suggestions/issues/243#issu... https://old.reddit.com/r/ProgrammingLanguages/comments/placo... F# designer Don Syme is making the "biformity" argument, e.g. needing a debugger for compile time as well as runtime. and Syme & Matsakis: F# in the Static v. Dynamic divide https://old.reddit.com/r/ProgrammingLanguages/comments/rpcm6... I still think something an application language with something like Zig's comptime would fill a big niche. (As opposed to a systems language.)
In Why static languages suffer from complexity
F# is how I learned about type providers: http://fsprojects.github.io/FSharp.Data/library/CsvProvider.... But look at that syntax: CsvProvider<"file.csv">.Load("file.csv") The file name is listed twice! Conceivably a macro could hide that, but we'd still have the issue that the string has to be written fully. I.e., I can't just call a function to generate the string. F# has Literals that mitigate some of this, but my understanding is that they are pretty limited: https://github.com/fsharp/fslang-suggestions/issues/539 On the other hand, Empirical can perform automatic compile-time function evaluation on any legal expression, including across variables, user-defined functions, user-defined datatypes, etc. func filename(n): let value = String(n + 1) return "/path/to/" + value + ".csv" end load(filename(7)) I could put the
Read the rest
filename in a Dataframe embedded in my source, then reference the row/column I want. Empirical's automatic CTFE handles it.
In Types for Tables: A Language Design Benchmark

Showing the 15 most recent of 31 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.