#indent "off" в F # - PullRequest
       35

#indent "off" в F #

12 голосов
/ 30 апреля 2010

Я только начал изучать 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 Авторские права (c) Microsoft Corporation. Все права защищены.

fstest2.fs (1,1): предупреждение FS0062: это Конструкция для совместимости ML. Попробуйте использовать файл с расширением Вместо этого «.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 , но не может понять это.

Ответы [ 2 ]

16 голосов
/ 30 апреля 2010

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

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

Эта тема уже обсуждалась в этом вопросе 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 

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

...