Разбить оператор (выражение) на несколько строк: как сделать отступ - PullRequest
7 голосов
/ 24 апреля 2011

Я обнаружил, что очень сложно найти простое руководство по отступам в F #.По сути, мне интересно, каково правило для многострочного отступа.В C # нет проблем, потому что пробелы не учитываются.Хотя я могу написать код F # согласно своей интуиции, и он работает, я действительно хочу знать, каково правило разбивать один оператор на несколько строк.Я пишу как

printfn "%d"
    1

Это работает, как ожидалось

И если я пишу их в той же колонке, что-то идет не так.

>
printfn "%A%A"
1
[];;
> //nothing is returned... and no error in this case

Я хочу подтвердитьОсновное правило для этого.Это немного раздражает, когда вы не можете быть уверены, что делаете.

Заранее спасибо

Я только что попробовал другой случай

List.iter
    (printfn "%d")
        [1..10];;

И он распечатывает 1до 10. Почему это не

List.iter
    ((printfn "%d")
        [1..10]);;

Ответы [ 2 ]

7 голосов
/ 24 апреля 2011

Как указывает Инь, правило состоит в том, что аргументы функции должны иметь отступ больше, чем вызов функции. Чтобы добавить больше деталей, ваш первый фрагмент интерпретируется так:

printfn "%A%A";
1;
[];

Каждое из них является допустимым выражением, которое возвращает что-то (функция, номер, пустой список), а затем игнорирует результат и продолжает. Поскольку они написаны в области верхнего уровня, F # Interactive не выдает предупреждение о том, что вы игнорируете некоторые значения. Если они были в do блоке или let объявлении:

do
  printfn "%A%A"
  1
  []

Компилятор F # выдаст предупреждение при секвенировании выражений (используя ;), которые не возвращают unit:

stdin (5,3): предупреждение FS0193: это выражение является значением функции, т.е. отсутствуют аргументы. Это тип 'a ->' b -> unit.

stdin (6,3): предупреждение FS0020: это выражение должно иметь тип 'unit', но имеет тип е 'инт'. Используйте «ignore», чтобы отменить результат выражения, или «let», чтобы связать результат к имени.

stdin (5,3): предупреждение FS0020: это выражение должно иметь тип 'unit', но имеет тип e '' список '. Используйте «ignore», чтобы отменить результат выражения, или «let» для b ind результат для имени.

3 голосов
/ 24 апреля 2011

Во втором примере вы должны сделать отступ:

>
printfn "%A%A"
  1
  [];;

В противном случае три выражения являются тремя последовательными выражениями, а не одним выражением.

Вы можете обратиться к Спецификация языка F # для получения четких правил, например, Глава 15 в спецификации.

...