Я только что начал изучать 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)
[]
Application.Run(form)
Вывод:
Компилятор Microsoft (R) F# 2.0 создает 4.0.30319.1 Copyright (c) Microsoft Corporation.Все права защищены.
fstest2.fs (1,1): предупреждение FS0062: Эта конструкция для совместимости ML. Conside r использование файла с расширением '.ml' или '.mli' вместо этого. Можно отключить, это предупреждает луг при помощи '-mlcompatibility' или '-nowarn:62'.
fstest2.fs (9,2): ошибка FS0010: Неожиданное ключевое слово 'позволило' или 'использует' в выражении. Ожидаемый 'в' или другой маркер.
fstest2.fs (13,1): ошибка FS0597: Последовательные аргументы должны быть разделены spac es или tupled, и аргументы, включающие функцию или приложения метода, должны быть заключены в скобки
fstest2.fs (9,14): ошибка FS0374: Недопустимое выражение на левом из присвоения
fstest2.fs (16,1): ошибка FS0010: Неожиданный идентификатор в определении
Угадайте, что ошибка находится где-нибудь в блоке меток, которому позволяют, но не могла понять это.
Эта тема уже обсуждалась в этом вопросе на 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
Для более подробного обсуждения см. также этот пост.
Если вы используете "#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)
с точкой с запятой и в
s и все другие виды синтаксического шума повсюду. Вы, вероятно, будете счастливее, если ваш редактор будет преобразовывать вкладки в пробелы (и иметь умный редактор, который может обрабатывать пробелы, как если бы они были вкладками, например, чтобы backspace мог создать резервную копию одной табуляции).