#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 

Дополнительные обсуждения см. также в этом сообщении.