Когда вы ставите двойные точки с запятой в 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)

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