Когда вы ставите двойные точки с запятой в F #? - PullRequest
31 голосов
/ 19 апреля 2010

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

Ответы [ 9 ]

34 голосов
/ 19 апреля 2010

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

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

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

  • Список из F # интерактивный

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

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

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

9 голосов
/ 19 апреля 2010

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

6 голосов
/ 19 апреля 2010

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

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

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

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

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

3 голосов
/ 19 апреля 2010

Символ и справочник оператора (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 # так, как он будет выглядеть в интерактивном сеансе. В частности, интерактивный сеанс предоставляет приглашение>, требует двойной точки с запятой ;; идентификатор в конце фрагмента кода для принудительной оценки и возвращает имена (если есть) и типы результирующих определений и значений.

2 голосов
/ 01 мая 2011

Двойная точка с запятой используется для обозначения конца блока кода, который готов для оценки в интерактивном режиме 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.

2 голосов
/ 19 апреля 2010

Я подозреваю, что вы видели код 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?

0 голосов
/ 30 апреля 2011

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

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

0 голосов
/ 19 апреля 2010

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

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

0 голосов
/ 19 апреля 2010

Для двойных точек с запятой нет цели (вне F # интерактивный). Точка с запятой, в соответствии с MSDN :

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...