Я заметил, что следующий код компилируется и работает в VS 2013:
let f() =
do Console.WriteLine(41)
42
Но при рассмотрении спецификации F # 3.0 я не могу найти упоминания о do
, используемом таким образом. Насколько я могу судить, do
может иметь следующие применения:
- Как часть цикла (например,
while expr do expr done
), это не так. -
Внутренние выражения вычисления, например:
seq { for i in 1..2 do do Console.WriteLine(i) yield i * 2 }
В этом случае не так,
f
не содержит выражений вычисления.Хотя меня здесь смущает то, что согласно спецификации,
do
следует заin
. То, чтоin
должно быть необязательным из-за легкого синтаксиса, но добавление его здесь вызывает ошибку компиляции ( "Неожиданный токен" в "или неполном выражении" ). -
Заявление внутри модуля или класса. Это также не так,
do
находится внутри функции, а не внутри модуля или класса.
Я также заметил, что с #light "off"
код не компилируется ( "Неожиданное ключевое слово" делает "в привязке" ), но я не нашел ничего, что объясняло бы это в разделе о легком синтаксисе.
Исходя из всего этого, я бы предположил, что использование do
внутри функции таким образом не должно компилироваться, но это так. Я что-то пропустил в спецификации? Или это на самом деле ошибка в компиляторе или в спецификации?