2016-09-03 8 views
7

W F # poniższa instrukcja nie powiedzie się z następujących błędówDlaczego umieszczenie pierwszego wiersza wyrażenia w tym samym wierszu, co nie pozwala na kompilację?

let listx2 = [1..10] 
    |> List.map(fun x -> x * 2) 
    |> List.iter (fun x -> printf "%d " x) 

Blok po to „niech” jest niedokończone. Spodziewaj się ekspresji.

Nieoczekiwany operator wiązań w wiązaniu. Oczekiwany niekompletny konstrukt konstrukcyjny w tym punkcie lub przed nim lub inny token.

Jednak dodaje skompiluje

let listx2 = 
    [1..10] 
    |> List.map(fun x -> x * 2) 
    |> List.iter (fun x -> printf "%d " x) 

Zauważyłem również, że to kompiluje, ale ma ostrzeżenia

let listx2 = [1..10] |> 
    List.map(fun x -> x * 2) |> 
    List.iter (fun x -> printf "%d " x) 

Możliwe nieprawidłowe wcięcie: ten znak jest na spalonym kontekstu rozpoczął na stanowisku (10:18). Spróbuj wgrać ten token dalej lub używając standardowych konwencji formatowania.

Jaka jest różnica między dwoma pierwszymi stwierdzeniami?

Odpowiedz

7

Kiedy masz

let listx2 = [1..10] 

jesteś domyśle ustawienie poziomu wcięcia następnego wiersza być w tym samym charakterze jak [. Zgodnie z następującą zasadą dla znaków postronnych ze specyfikacji:

Natychmiast po napotkaniu = tokenu w kontekście Let lub Member.

Tak więc w pierwszym przykładzie |> jest wcięty mniej niż [ więc pojawi się błąd, ale w drugiej są takie same, więc to wszystko działa.

Nie jestem do końca pewien, dlaczego przeniesienie |> na koniec linii daje tylko ostrzeżenie.

+0

Dla eol '|>': Myślę, że linia, która kończy się z operator niejawnie kontynuuje w następnej linii, niezależnie od jego wcięcia. – Tarmil