Ошибка отступа в f #? - PullRequest
       24

Ошибка отступа в f #?

2 голосов
/ 11 апреля 2011

Рассмотрим следующий код:

let fn () =
  let b =
    8. // any expression
  -b

let fn2 () =
  let b =
    8. // any expression
  - b

"fn" компилируется, а "fn2" - нет (обратите внимание на пробел перед "b").Сообщение об ошибке:

Блок, следующий за этим 'let', не завершен.Ожидайте выражения.

Почему это?

Ответы [ 3 ]

9 голосов
/ 11 апреля 2011

F # допускает различные виды «отступов», когда вам разрешено использовать меньший отступ, но при этом оставаться в пределах одного и того же выражения.

Один из таких допустимых «отступов» предназначен для операторов.Вы можете написать

    foo
        |> bar
        |> baz

или

    foo
    |> bar
    |> baz

или даже

    foo
 |> bar
 |> baz

, и инфиксные операторы продолжат то же выражение в следующей строке.Правило состоит в том, что вам разрешается «отменять» длину «оператора инфикса плюс один пробел», при этом подразумевается, что это позволяет выровнять значения, которые вы используете.Распространенный случай подобен таблице чисел, например

let x = 
    42
  + 21
  + 62

, где строка ниже 42 может начинаться с меньшего отступа на два пробела, так что следующее число будет выровнено под предыдущим.

Так или иначе, это правило действует здесь, и без пробела «двоичный минус» имеет приоритет над «унарным минусом», а затем включается правило инфиксного отступа.

2 голосов
/ 11 апреля 2011

fn2 анализируется как:

let fn2 () =
  let b = 8. - b

Блок let не завершен, ему нужно возвращаемое значение, например.

let fn2 () =
  let b = 8. - b
  b

Я предлагаю вам использовать пробелы вокруг двоичногооператоры и без пробелов после унарных операторов.Точно так же существует разница между x - 2 (вычитание) и x -2 (вызов функции x с аргументом -2).

1 голос
/ 11 апреля 2011

Это твое отступление от 8. Когда я ввожу этот код:

let fn () =
    let b =
        8.
    -b

let fn2 () = 
    let b =
        8.
    - b

Правильно компилируется. Происходит то, что в первом примере fn2 эквивалентно:

let b = 8 - b

и компилятору нужно что-то еще для завершения блока let (я всегда читаю блок let как "let foo = bar in expr"). Таким образом, вы пропустите часть expr. В fn вы получаете «let b = 8. in -b».

...