Подтвердить что ты не робот

Когда вы ставите двойные точки с запятой в F #?

Это глупый вопрос. Я читал пару книг по F # и не могу найти ничего, что объясняет, когда вы кладете;; после заявления, и я не могу найти образец в чтении. Когда вы заканчиваете утверждение двойными полуколонами?

4b9b3361

Ответ 1

В неинтерактивном коде F #, который не должен быть совместим с OCaml, вам не нужно будет когда-либо дублировать точку с запятой. В OCaml-совместимом режиме вы должны использовать его в конце объявления функции верхнего уровня (в последних версиях вы можете переключиться в этот режим, используя файлы с расширением .ml или добавив #light "off" в начало).

Если вы используете инструмент командной строки fsi.exe или F # Interactive в Visual Studio, вы должны использовать ;; для завершения текущего ввода для F #.

Когда я отправляю образцы кода здесь в StackOverflow (и в примерах кода из моя книга), я использую ;; в когда я также хочу показать результат вычисления выражения в F # interactive:

  • Листинг из F # interactive

    > "Hello" + " world!";;
    val it : string = "Hello world!"
    > 1 + 2;;
    val it : int = 3
    
  • Стандартный исходный код F #

    let n = 1 + 2
    printf "Hello world!"
    

Иногда также полезно показывать результат как часть списка, поэтому я считаю, что эта нотация весьма полезна, но я нигде не объяснял ее, так что здорово, что вы спросили!

Ответ 2

Вы говорите о собственно F # или о запуске функций F # в F # Interactive? В F # Interactive;; принудительно выполняет введенный код. кроме этого;; не имеет никакого особого значения, которое я знаю о

Ответ 3

В F # требуется только место ;;, чтобы закончить выражения в интерактивном режиме.

;; остается от перехода от OCaml, где, в свою очередь, он остается от Caml Light. Первоначально ;; использовался для завершения "фраз" верхнего уровня, то есть let, type и т.д. OCaml сделал ;; необязательным, так как типичный модуль состоит из ряда операторов let, возможно, один оператор в конце вызовет главную функцию. Если вы отклоняетесь от этого шаблона, вам нужно отделить утверждения с помощью ;;. К сожалению, в OCaml, когда ;; является необязательным и требуемым, сложно изучить.

Однако F # вводит две соответствующие модификации синтаксиса OCaml: отступы и do. Операторы верхнего уровня должны находиться внутри блока do, а для блоков требуется отступ, поэтому F # всегда знает, что каждое утверждение верхнего уровня начинается с do и отступа и заканчивается с помощью outdent. Не требуется больше ;;.

В целом, все, что вам нужно знать, это синтаксис [O '] Caml, и F # устраняет множество его проблем, но сохраняет много путающей обратной совместимости. (Я считаю, что F # все еще может скомпилировать много кода OCaml.)

Примечание. Этот ответ основывался на моем опыте с OCaml и ссылка Adam Gent опубликовала (что, к сожалению, не очень полезно, если вы не знаете OCaml).

Ответ 4

Справочник по символу и оператору (F #)

http://msdn.microsoft.com/en-us/library/dd233228(v=VS.100).aspx

Полуколон:

• Разделяет выражения (используемые в основном в подробном синтаксисе).

• Отделяет элементы списка.

• Разделяет поля записи.

Двойной полуколон:

http://www.ffconsultancy.com/products/fsharp_journal/free/introduction.html

Статьи в тексте F #.NET Journal цитируют код F #, который будет отображаться в интерактивном сеансе. В частности, интерактивный сеанс предоставляет приглашение > , требуется двойная точка с запятой;; идентификатор в конце фрагмента кода для принудительной оценки и возвращает имена (если есть) и типы полученных определений и значений.

Ответ 5

Я подозреваю, что вы видели код F #, написанный, когда синтаксиС#light не был включен по умолчанию (синтаксиС#light включен по умолчанию для CTP 2009 и более поздних версий, а также для Visual Studio 2010), а затем ;; означает конец объявления функции.

Итак, что такое синтаксиС#light? Он поставляется с объявлением #light:

Объявление #light делает пробелы значительны. Разрешение разработчик опустить определенные ключевые слова такие как in,;,;;, begin и end.

Здесь код, написанный без синтаксиса #light:

let halfWay a b =
  let dif =  b - a in
  let mid = dif / 2 in
  mid + a;;

и становится с сильным синтаксисом:

#light
let halfWay a b =
  let dif =  b - a
  let mid = dif / 2
  mid + a

Как уже говорилось, вы можете опустить теперь объявление #light (это должно быть так, если вы находитесь на недавнем CTP или Visual Studio 2010).

См. также эту тему, если вы хотите узнать больше о синтаксисе #light: F # - Должен ли я учиться с или без #light?

Ответ 6

Двойная двоеточие используется для обозначения конца блока кода, который готов для оценки в F # interactive при вводе непосредственно в интерактивный сеанс. Например, при использовании в качестве калькулятора.

Это редко встречается в F #, потому что вы обычно пишете код в файл script, выделяете его и используете ALT + ENTER для его оценки, а Visual Studio эффективно вводит ;; в конце для вас.

OCaml - это то же самое.

Литература часто цитирует код, написанный так, как он появился бы, если бы он был введен в интерактивный сеанс, потому что это ясный способ передать не только код, но и его предполагаемый тип. Например:

> [1; 2; 3];;
val it : int list = [1; 2; 3]

Это означает, что вы вводите выражение [1; 2; 3] в интерактивный сеанс, за которым следует ;;, обозначающий конец блока кода, который готов к оценке в интерактивном режиме, и компилятор отвечает с помощью val it : int list = [1; 2; 3], описывая, что выражение оценивается по значению типа int list.

Ответ 7

Нет цели для двойных полуколонок (вне F # interactive). Полу-двоеточие, в соответствии с MSDN:

  • Отделяет выражения (используется в основном в подробном синтаксисе).
  • Разъединители элементы списка.
  • Разъединители поля записи.

Следовательно, в первом случае ;; будет разделять выражение перед первой точкой с запятой из пустого выражения после него, но перед второй точкой с запятой, и отделяя это пустое выражение от того, что было после второго полу -colon (точно так же, как, например, С# или С++).

В экземпляре списка я подозреваю, что вы получите ошибку для определения пустого элемента списка.

Что касается записи, я подозреваю, что она будет похожа на разделение выражений, причем пустое пространство между полуколонами эффективно игнорируется.

F # interactive выполняет введенный F # при просмотре двойной точки с запятой.

[Обновлено для просмотра F # interactive - любезно предоставлено mfeingold)

Ответ 8

Двойная точка с запятой, скорее всего, поступает из OCaml, так как на этом основан язык. См. текст ссылки

В основном это для исторических целей, и вам нужно это для оценщик (repl), если вы его используете.

Ответ 9

История двойной точки с запятой можно проследить до начала ML, когда точки с запятой были использованы в качестве разделителя в списках вместо запятых. В этом ICFP 2010 - Дань Робин Милнер вокруг 50:15 Майк Гордон упоминает:

Был разговор на F #, где кто-то спросил: "Почему в конце команд F # есть точка с двумя точками с запятой?" Причина заключается в том, что разделитель в списках в оригинале ML является точкой с запятой, поэтому, если вам нужен список 1; 2; 3; и поместите его на отдельные строки - если вы закончили линию с точкой с запятой, вы не закончили фразу, поэтому использование двойной точки с запятой означало конец выражения. Затем в стандартном ML разделитель для списков стал запятой, поэтому вы могли использовать одиночные точки с запятой для завершения списков.