2016-04-08 19 views
5

Quando le persone parlano di F # a volte menzionano il termine top-level;In F # cosa significa top-level?

cosa significa "top-level"?

Ad esempio, nel precedente SO Q & Un

Error FS0037 sometimes, very confusing
Defining Modules VS.NET vs F# Interactive
What the difference between a namespace and a module in F#?
AutoOpen attribute in F#
F# and MEF: Exporting Functions How to execute this F# function

Il termine compare regolarmente anche nei commenti, ma per coloro Q & AI non ha fatto refe rence loro.

L'articolo di Wikipedia su scope tocca questo, ma non ha specifiche per F #.

La F # 3.x spec afferma soltanto:

11.2.1.1 Arity conformità per funzioni e valori

Le parentesi indicano una funzione top-level, che potrebbe essere un'espressione calcolata di prima classe calcola un valore di funzione, anziché un valore di funzione in fase di compilazione.

13,1 Attributi personalizzati

Ad esempio, l'attributo STAThread deve essere posto immediatamente prima di una dichiarazione top-level “fare”.

14.1.8 Risoluzione nomi per variabili di tipo

è inizialmente vuoto per qualsiasi utente o qualsiasi altra top-level costrutto contenente espressioni e tipi.

ho il sospetto che il termine ha significati diversi in contesti diversi: Scope, F # interattivo, shadowing.

Se si potesse anche spiegare le origini dai linguaggi predecessori di F #, (ML, CAML, OCaml), sarebbe apprezzato.

Infine, non ho intenzione di contrassegnare una risposta accettata per alcuni giorni per evitare risposte affrettate.

+0

di interesse legati alla OCaml: [toplevel system] (http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual023.html) –

+0

Di interesse: [modulo vs tipo differenza di comportamento sull'uso di F # lambda come argomento effettivo del parametro formale che si aspetta System .Func] (http://stackoverflow.com/q/31712588/1243762) –

risposta

4

Penso che il termine livello superiore abbia un significato diverso in diversi contesti.

In generale, lo userei ogni volta che si dispone di una struttura che consente al nidificazione di fare riferimento a una posizione nella parte superiore che non è nidificata all'interno di nient'altro.

Per esempio, se lei ha detto "parentesi di alto livello" in un'espressione, sarebbe fare riferimento al più esterno coppia di parentesi:

((1 + 2) * (3 * (8))) 
^     ^

Quando si parla di funzioni e legature di valore (e ambito) in F #, si riferisce alla funzione che non è annidata all'interno di un'altra funzione. Così funzioni all'interno moduli sono di livello superiore:

module Foo = 
    let topLevel n = 
    let nested a = a * 10 
    10 + nested n 

Qui, nested è annidato all'interno topLevel.

in F #, funzioni e valori definiti mediante let può apparire moduli all'interno o classi interne, che complica le cose un po '- direi solo i moduli interni sono alto livello, ma che probabilmente è solo perché sono pubbliche per impostazione predefinita.

Il do parola chiave funziona in modo simile - è possibile nidificare (anche se quasi nessuno lo fa), e così di alto livello do che permette STAThread attributo è quella che non è nidificato all'interno di un altro do o let:

module Foo = 
    [<STAThread>] 
    do 
    printfn "Hello!" 

Bud non è consentito su qualsiasi do nidificato all'interno di un'altra espressione:

do 
    [<STAThread>] 
    do 
    printfn "Hello!" 
    printfn "This is odd notation, I know..."