2010-04-30 2 views
11

Ho appena iniziato l'apprendimento F #, e ha cercato un codice da the wiki:#indent "off" in F #

preferisco tabulazioni in spazi, in modo da modificare il codice un po 'in questo:

#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) 

L'output è:

Microsoft (R) F # 2.0 Compilatore build 4.0.30319.1 Copyright (c) Microsoft Corporation. Tutti i diritti riservati.

fstest2.fs (1,1): avviso FS0062: questo costrutto è per compatibilità ML. È necessario utilizzare un file con estensione ".ml" o ".mli". È possibile disattivare questo avviso utilizzando "--mlcompatibility" o "--nowarn: 62".

fstest2.fs (9,2): errore FS0010: Parola chiave imprevista "lascia" o "utilizza" nell'espressione . Previsto token "in" o altro .

fstest2.fs (13,1): errore FS0597: argomenti consecutivamente vanno separati da spac es o tupled e argomenti coinvolgono funzione o metodo applicazioni devono essere tra parentesi

fstest2.fs (9 , 14): l'errore FS0374: non valido espressione a sinistra del assegnazione

fstest2.fs (16,1): l'errore FS0010: identificatore imprevisto nella definizione

Indovina che l'errore è da qualche parte nel lasciare il blocco etichetta, ma non è stato possibile capirlo.

+2

Hahaha, solo la prova che preferire le schede agli spazi è SBAGLIATO, SBAGLIATO, SBAGLIATO! :) – Benjol

+9

@Benjol ... {angry-face-emoji} – stun

risposta

13

Se si utilizza "#indent off", allora si perde tutta la sintassi più semplice che ricorda lo spazio bianco e si deve tornare a utilizzare per es.

#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)  

con un punto e virgola e in s e tutti gli altri tipi di rumore sintattica ovunque. Probabilmente sarai più contento di avere il tuo editor per convertire le schede in spazi (e di avere un editor intelligente in grado di trattare gli spazi come se fossero schede, ad esempio in modo che backspace possa eseguire il backup di un punto di tabulazione).

+0

Come in OCaml, i ';;' non sono richiesti qui. – Laurent

6

Questo argomento era già stato discusso in this StackOverflow question. Come spiega Brian, disattivare la sintassi "leggera" significa che dovrai scrivere nella sintassi compatibile con OCaml.

Credo che nella maggior parte dei casi, la sintassi basata su indentazione sia più leggibile (e quindi vale la pena passare da tabulazioni a spazi). Tuttavia, la sintassi con rumore aggiuntivo (ad esempio in e ;;) rivela di più sulla struttura della lingua, quindi potrebbe essere utile giocarci brevemente durante l'apprendimento di F #.

L'esempio seguente mostra tutte le cose aggiuntive che avete bisogno di scrivere:

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 

Per ulteriori discussioni, see also this post.

+1

anta40 dice "Preferisco le schede agli spazi". Non è del tutto chiaro il motivo per cui le schede non sono consentite per il rientro in F # per la sintassi della luce? Immagina, qualcuno ha il suo editor di testo preferito e alcuni strumenti di testo e solo abitudini cresciute e lucidate per anni per le schede, non per gli spazi ... e ora ci sono solo due scelte per F #: spazi-luce-accesa, tab-light-off. –

+4

@ anta40 - IIRC, il problema è che diversi editor possono usare diverse tabulazioni di larghezza e anche mescolare gli spazi. Dato che le modifiche alla larghezza della tabulazione potrebbero modificare il livello di indentazione di una determinata riga, ciò potrebbe anche cambiare il significato del programma stesso, con il risultato di notare con molta difficoltà i bug. –

+1

@JamesHugard La scheda è solo un personaggio di per sé. Non ha 'larghezza'. La larghezza della tabulazione è solo un concetto grafico per la visualizzazione del testo. Sono d'accordo sul fatto che la combinazione di schede e spazi potrebbe risultare difficile notare i bug però. – MEMark