#indent "off" в F #
Я только начал изучать F # и попробовал код из wiki:
Я предпочитаю вкладки в пробелы, поэтому я немного меняю код:
#indent "off"
open System
open System.Windows.Forms
let form = new Form(Visible=true, TopMost=true, Text="Welcome to F#")
let label =
let temp = new Label()
let x = 3 + (4 * 5)
temp.Text <- sprintf "x = %d" x
temp
form.Controls.Add(label)
[<STAThread>]
Application.Run(form)
Вывод:
Компилятор Microsoft (R) F # 2.0 4.0.30319.1 Авторское право (c) Корпорация Microsoft. Все права защищены.
fstest2.fs(1,1): предупреждение FS0062: это Конструкция для совместимости ML. Conside r с использованием файла с расширением '.ml' или '.mli'. Ты можешь отключите это предупреждение, используя '--mlcompatibility' или '-nowarn: 62'.
fstest2.fs(9,2): ошибка FS0010: Непредвиденное ключевое слово 'let' или 'use' в выражение. Ожидаемый "в" или другой лексема.
fstest2.fs(13,1): ошибка FS0597: Последовательные аргументы должны быть разделенные пробелами или чередующимися, и аргументы, связанные с функцией или методом приложения должны быть заключены в скобки
fstest2.fs(9,14): ошибка FS0374: Недопустимое выражение слева от Назначение
fstest2.fs(16,1): ошибка FS0010: Неожиданный идентификатор в определении
Угадайте, что ошибка находится где-то в блоке let label, но не могла понять это.
Ответы
Ответ 1
Если вы используете "#indent off", вы теряете все более простой синтаксис, поддерживающий пробелы, и должны вернуться к использованию, например,
#indent "off"
open System
open System.Windows.Forms
let label =
let temp = new Label() in
let x = 3 + (4 * 5) in
temp.Text <- sprintf "x = %d" x;
temp;;
let form =
let f = new Form() in
f.Controls.Add(label);
f;;
[<STAThread>]
do Application.Run(form)
с точками с запятой и in
и всеми другими синтаксическими шумами везде. Вероятнее всего, вы будете счастливее, если ваш редактор будет конвертировать вкладки в пробелы (и иметь интеллектуальный редактор, который может обрабатывать пробелы, как если бы они были вкладками, например, чтобы backspace мог создать резервную копию одного табу-стопа).
Ответ 2
Этот вопрос уже обсуждался fooobar.com/info/157297/.... Как объясняет Брайан, отключение "легкого" синтаксиса означает, что вам придется писать в синтаксисе, совместимом с OCaml.
Я считаю, что в большинстве случаев синтаксис, основанный на отступе, более читабельен (и поэтому стоит переключиться с вкладок на пробелы). Однако синтаксис с дополнительным шумом (например, in
и ;;
) показывает больше о структуре языка, поэтому может быть полезно сыграть с ним вкратце, изучая F #.
В следующем примере показаны все дополнительные вещи, которые вам нужно написать:
let add a b c =
let ab = a + b in // 'in' keyword specifies where binding (value 'ab') is valid
printfn "%d" ab; // ';' is operator for sequencing expressions
c - ab;; // ';;' is end of a function declaration
Дополнительные обсуждения см. также в этом сообщении.