Интерполированные строки в F#

Я пытаюсь использовать функцию интерполированного SQL-запроса Entity Framework Core в F#, для которой требуется FormattableString. Однако, к моему удивлению, он не работает, поскольку я не могу найти способ преобразовать обычную строку F# в этот тип. Я полагал, что просто делать то, что вы делаете на C#, будет работать, но это не так. Вот код, который у меня есть сейчас:

let fromDbUser (u : Entity.User) = 
    {
        name = u.Name
        age = u.Age
        phone = u.Phone
    }

let mname = "Foo" 

let ctx = new Entity.DatabaseContext()
ctx.User.FromSqlInterpolated($"Select * FROM User Where name = {mname};") 
|> Seq.map(fromDbUser)
|> printfn "%A"

Запуск этого блока кода приводит к ошибке компиляции:

Этот токен зарезервирован для использования в будущем

Я пытался погуглить, но мне не удалось найти способ заставить это работать, любая помощь будет очень признательна!

2 ответа

F# не имеет строковой интерполяции.

Для него есть RFC, одобренный в принципе.

Ошибка в том, что $символ зарезервирован (на 6 лет + на момент написания) и, вероятно, будет использоваться для интерполяции строк при его добавлении.

Как заметил Дэйв, интерполяция еще не реализована. Но для методов, которые абсолютно требуютFormattableString или IFormattable, вы можете использовать FormattableStringFactory.Create

let query (sql: FormattableString)  = 
    printfn "%s" (sql.ToString(null, null))

let mname = "Foo"         
let fstr = FormattableStringFactory.Create("Select * FROM User Where name = {0};", mname)

query fstr

Он доступен с F# 5.0.

> let mname = "Foo" ;;
val mname : string = "Foo"

> let str = $"Select * FROM User Where name = {mname};" ;;
val str : string = "Select * FROM User Where name = Foo;"

Проверь это. https://docs.microsoft.com/en-us/dotnet/fsharp/whats-new/fsharp-50#string-interpolation

Другие вопросы по тегам