#отступ в F#

Я только начал изучать F# и попробовал код из вики:

Я предпочитаю табуляцию пробелам, поэтому немного меняю код на это:

#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 Copyright (c) Microsoft Corporation. Все права защищены.

fstest2.fs(1,1): предупреждение FS0062: эта конструкция предназначена для совместимости с ML. Вместо этого рассмотрите возможность использования файла с расширением «.ml» или «.mli». Вы можете отключить это предупреждение, используя '--mlcompatibility' или '--nowarn:62'.

fstest2.fs(9,2): ошибка FS0010: непредвиденное ключевое слово «разрешить» или «использовать» в выражении. Ожидаемый вход или другой токен.

fstest2.fs(13,1): ошибка FS0597: последовательные аргументы должны быть разделены пробелами или объединены в кортежи, а аргументы, включающие приложения функций или методов, должны быть заключены в круглые скобки

fstest2.fs(9,14): ошибка FS0374: недопустимое выражение слева от присваивания

fstest2.fs(16,1): ошибка FS0010: непредвиденный идентификатор в определении

Предполагаю, что ошибка где-то в блоке let label, но не могу понять.


person anta40    schedule 30.04.2010    source источник
comment
Ха-ха-ха, просто доказательство того, что предпочтение табуляции пробелам НЕПРАВИЛЬНО, НЕПРАВИЛЬНО, НЕПРАВИЛЬНО! :)   -  person Benjol    schedule 03.05.2010
comment
@Benjol ... {angry-face-emoji}   -  person stun    schedule 22.03.2011


Ответы (2)


Если вы используете «#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)     

с точками с запятой и ins и всеми другими видами синтаксического шума повсюду. Вы, вероятно, будете счастливее, просто если ваш редактор преобразует табуляцию в пробелы (и у вас будет интеллектуальный редактор, который может обрабатывать пробелы, как если бы они были табуляциями, например, чтобы возврат на одну позицию табуляции мог выполнять резервную копию).

person Brian    schedule 30.04.2010
comment
Как и в OCaml, здесь ;; не требуются. - person Laurent; 11.04.2011

Эта тема уже обсуждалась в этом вопросе StackOverflow. Как объясняет Брайан, отключение «облегченного» синтаксиса означает, что вам придется использовать синтаксис, совместимый с 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 

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

person Tomas Petricek    schedule 30.04.2010
comment
anta40 говорит: «Я предпочитаю вкладки пробелам». Не совсем понятно, почему табы не разрешены для отступов в F # для легкого синтаксиса? Представьте, у кого-то есть любимый текстовый редактор, несколько текстовых инструментов и просто годами выработанные и отшлифованные привычки к табуляциям, а не к пробелам… и теперь для F# есть только два варианта: пробелы-включить, вкладки-включить. - person Roman Kuzmin; 30.04.2010
comment
@ anta40 - IIRC, проблема в том, что разные редакторы могут использовать табуляции разной ширины, а также смешивать пробелы. Поскольку изменения ширины табуляции могут изменить уровень отступа любой данной строки, это также может изменить смысл самой программы, что приведет к очень трудно заметным ошибкам. - person James Hugard; 01.05.2010
comment
@JamesHugard Вкладка сама по себе является просто символом. У него нет «ширины». Ширина вкладки — это просто графическое понятие для отображения текста. Я согласен с тем, что смешивание табуляции и пробела может привести к трудно заметным ошибкам. - person MEMark; 22.10.2013
comment
Смешение вкладок и пробелов не отвечает за структуру управления, но, учитывая, что даже Python допускает одно или другое на любом уникальном уровне области видимости, для F# нелепо просто полностью запрещать вкладки. - person Zoey; 03.05.2014
comment
@zoey, или вы просто счастливы, что код будет выглядеть одинаково в каждой системе, и больше нет необходимости в войне табуляции и пробелов. Выравнивание по вертикали важно, и существуют тонкие правила отступа для одной или двух позиций, что было бы вообще невозможно с вкладками. Возвращение к разрешению вкладок означало бы более ограниченный синтаксис и потерю ясности. - person Abel; 05.08.2020
comment
@Abel Весь смысл вкладки в том, что люди предпочитают разные расстояния отступов, поэтому не все будут видеть одинаковый вид в каждой системе как победу. Теперь у вас просто войны между людьми, предпочитающими одинарный отступ, двойной отступ, тройной отступ и так далее :P - person Kim; 18.01.2021
comment
@ Ким, я знаю, и с менее сложным синтаксисом это может сработать. Но так как вы можете отменить отступ на меньшую, чем полную ширину отступа (т. е. вы можете поместить символ [ без отступа на две позиции, чтобы операторы выровнялись по вертикали), и с табуляциями такого не бывает (нет половинной табуляции или четверти- tab), буквально невозможно правильно кодировать с помощью вкладок. Именно это я и пытался подчеркнуть: многие вещи теперь возможны, что было бы невозможно с вкладками. - person Abel; 20.01.2021