Это глупый вопрос. Я читал пару книг по F # и не могу найти ничего, что объясняет, когда вы кладете;; после заявления, и я не могу найти образец в чтении. Когда вы заканчиваете утверждение двойными полуколонами?
Когда вы ставите двойные точки с запятой в F #?
Ответ 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 разделитель для списков стал запятой, поэтому вы могли использовать одиночные точки с запятой для завершения списков.