Когда вы ставите двойные точки с запятой в F#?
Это глупый вопрос. Я читал пару книг по F# и не могу найти ничего, что объясняет, когда вы положили;; после заявления, я не могу найти образец в чтении. Когда вы заканчиваете утверждение двойными точками с запятой?
9 ответов
В неинтерактивном коде F#, который не должен быть совместимым с OCaml, вам не нужно когда-либо использовать двойную точку с запятой. В режиме, совместимом с OCaml, вы должны использовать его в конце объявления функции верхнего уровня (В последних версиях вы можете переключиться в этот режим, используя файлы с .ml
расширение или путем добавления #light "off"
наверх).
Если вы используете командную строку fsi.exe
инструмент или F# Interactive в Visual Studio, то вы бы использовали ;;
завершить текущий ввод для F#.
Когда я публикую примеры кода здесь, в Stackru (и в примерах кода из моей книги), я использую ;;
в листинге, когда я также хочу показать результат оценки выражения в F# интерактив:
Листинг из F# интерактивный
> "Hello" + " world!";; val it : string = "Hello world!" > 1 + 2;; val it : int = 3
Стандартный исходный код F#
let n = 1 + 2 printf "Hello world!"
Иногда также полезно показывать вывод как часть листинга, поэтому я считаю эту запись довольно полезной, но я нигде не объяснял ее, так что здорово, что вы спросили!
Вы говорите о собственно F# или о запуске функций F# в F# Interactive? В F# Интерактив;; принудительное выполнение только что введенного кода кроме этого;; не имеет никакого особого значения, о котором я знаю
В F# единственное место ;;
Требуется завершить выражения в интерактивном режиме.
;;
осталось от перехода от OCaml, где, в свою очередь, осталось от Caml Light. первоначально ;;
был использован для окончания "фраз" верхнего уровня - то есть, let
, type
и т. д. OCaml сделал ;;
необязательный, так как типичный модуль состоит из серии let
операторы с одним оператором в конце для вызова основной функции. Если вы отклоняетесь от этого паттерна, вам нужно отделить операторы ;;
, К сожалению, в OCaml, когда ;;
является необязательным по сравнению с обязательным, трудно учиться
Однако F# вводит две соответствующие модификации в синтаксис OCaml: отступ и do
, Заявления верхнего уровня должны идти внутрь do
block, и для блоков требуется отступ, поэтому F# всегда знает, что каждый оператор верхнего уровня начинается с do
и отступ и заканчивается отступом. Больше не надо ;;
требуется.
В целом, все, что вам нужно знать, это то, что синтаксис [O']Caml отстой, и F# устраняет многие его проблемы, но поддерживает много путаницы с обратной совместимостью. (Я считаю, что F# все еще может компилировать много кода OCaml.)
Примечание. Этот ответ основан на моем опыте работы с OCaml и размещенной Адамом Гентом ссылкой (что, к сожалению, не очень полезно, если вы не знаете OCaml).
Ссылка на символ и оператор (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 цитируют код F# так, как он выглядит в интерактивном сеансе. В частности, интерактивный сеанс предоставляет приглашение>, требует двойной точки с запятой;; идентификатор в конце фрагмента кода для принудительной оценки и возвращает имена (если таковые имеются) и типы результирующих определений и значений.
Двойная точка с запятой используется для обозначения конца блока кода, который готов для оценки в интерактивном режиме F#, когда вы печатаете непосредственно в интерактивном сеансе. Например, при использовании его в качестве калькулятора.
Это редко встречается в F#, потому что вы обычно пишете код в файл сценария, выделяете его и используете 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
,
Я подозреваю, что вы видели код F#, написанный, когда синтаксис #light не был включен по умолчанию (синтаксис #light включен по умолчанию для CTP за май 2009 г. и более поздних, а также для Visual Studio 2010), а затем ;;
означает конец объявления функции.
Так что же такое синтаксис #light? Он поставляется с объявлением #light:
Объявление #light делает пробел значимым. Позволяет разработчику опускать определенные ключевые слова, такие как,;,;;, начало и конец.
Вот код, написанный без синтаксиса #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?
История двойной точки с запятой может быть прослежена до начала ML, когда точки с запятой использовались в качестве разделителя в списках вместо запятых. В этом видео ICFP 2010 - Дань Робину Милнеру около 50:15 Майк Гордон упоминает:
На F# был разговор, где кто-то спросил: "Почему в конце команд F# стоит двойная точка с запятой?" Причина заключается в том, что разделитель в списках в оригинальном ML - это точки с запятой, поэтому, если вы хотите получить список 1;2;3; и поместите его в отдельные строки - если вы оканчивали строку точкой с запятой, вы не заканчивали фразу, поэтому использование двойной точки с запятой означало конец выражения. Затем в Standard ML разделитель для списков стал запятой, что означало, что вы можете использовать одинарные точки с запятой в конце списка.
Скорее всего, двойная точка с запятой происходит от OCaml, поскольку именно на этом основан язык. См текст ссылки
В основном это для исторических целей, и вам нужно это для оценщика (repl), если вы используете его.
Нет смысла использовать двойные точки с запятой (за пределами F# интерактивный). Точка с запятой, согласно MSDN:
- Разделяет выражения (используется в основном в подробном синтаксисе).
- Разделяет элементы списка.
- Разделяет поля записи.
Поэтому, во-первых, ;;
будет отделять выражение перед первой точкой с запятой от пустого выражения после него, но перед второй точкой с запятой, и отделять это пустое выражение от того, что следует после второй точки с запятой (как, например, в C# или C++).
Я подозреваю, что в случае списка вы получите ошибку при определении пустого элемента списка.
Что касается записи, я подозреваю, что это будет похоже на разделение выражений, при этом пустое пространство между точками с запятой фактически игнорируется.
F# интерактивный выполняет введенный F# при просмотре двойной точки с запятой.
[Обновлено для F# интерактивного - любезно предоставлено mfeingold)