fsharp / fsharp/fslang-suggestions

Suggestion: Add ways to disable not typed interpolated strings

Open
#1,285 6 comments 8 reactions 0 assignees View on GitHub
approved-in-principle
Dominant language
No language data
Stars
373
Forks
21
PR merge metrics
No merged PRs in 30d

Description

I propose we have a way to improve interpolated string.

Currently with interpolated strings can be done with or without the type identifier ( `%s` for example ).
It can be harmful when we do some code refactoring, not-typed interpolated strings can produce unexpected results.

For example :

``` F#
let hello = "Hello World"
printf $"{hello}" // ✅ Builds fine
printf $"%s{hello}" // ✅ Builds fine, same as `printf "%s" hello`
```

After some code refactoring we could be in this situation :

``` F#
type HelloWorld = HelloWorld of string
let hello = HelloWorld "Hello World"
printf $"{hello}" // ❌ Builds fine, prints `HelloWorld "Hello World"`
printf $"%s{hello}" // ✅ Does not build ( Error FS0001 : This expression was expected to have type 'string' but here has type 'HelloWorld' )
```

I would suggest adding a warning when using not-typed interpolated strings. And an optionnal way to force the usage of typed interpolated string for a project (WarningsAsErrors ?).

## Pros and Cons

**The advantages of making this adjustment to F# are** :

- More safety when using interpolated strings
- Less errors when refactoring code
- Errors detected at compile time

**The disadvantages of making this adjustment to F# are** :

- It can be a pain to add the type identifier to all interpolated strings
- Warnings can be annoying when using not-typed interpolated strings

## Extra information

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

## Affidavit (please submit!)

Please tick this by placing a cross in the box:
* [x] This is not a question (e.g. like one you might ask on [stackoverflow](http://stackoverflow.com)) and I have searched stackoverflow for discussions of this issue
* [x] I have [searched both open and closed suggestions on this site](http://github.com/fsharp/fslang-suggestions/issues) and believe this is not a duplicate
* [x] 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:
* [x] This is not a breaking change to the F# language design
* [x] 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 :+1: emoji on this issue. These counts are used to generally order the suggestions by engagement.

Contributor guide

No contributing guide indexed for this repository

Research direction

No files, tests, or compiler entry points are named. Start by reviewing how F# interpolated strings are specified and how compiler warnings and project-level warning settings are defined; done means reaching agreement on the warning behavior and an opt-in way to require typed interpolations, with corresponding implementation and tests identified.

Written by the indexing model from the issue text.

Assessment

Tech stack
fsharp
Domain
compilers
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.