2016-04-08 4 views
5

Когда люди говорят о F #, они иногда упоминают термин top-level;В F # что означает верхний уровень?

какой top-level средний?

Например, в предыдущем SO Q &

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

Термин также регулярно появляется в комментариях, но и для тех, кто Q & AI не сделал REFE их.

Статья Википедии о scope затрагивает это, но не имеет специфических особенностей для F #.

F # 3.x спецификации только гласит:

11.2.1.1 Arity Conformance для функций и значения

Скобки указывают на top-level функцию, которая может быть вычислена выражение а первого класса, который вычисляет значение функции, , а не значение функции времени компиляции.

13,1 Пользовательские атрибуты

Например, атрибут STAThread должен располагаться непосредственно перед «делать» заявление top-level.

14.1.8 Разрешение имен для переменных типа

изначально она пуста для любого члена или любой другой top-level построить , содержащий выражения и типы.

Я подозреваю, что термин имеет разные значения в разных контекстах: Область применения, F # интерактивная, затенение.

Если вы могли бы также объяснить происхождение из языков предшественника F # (ML, CAML, OCaml), это будет оценено.

Наконец, я не планирую отмечать ответ в течение нескольких дней, чтобы избежать поспешных ответов.

+0

Представляет интерес в связи с OCaml: [интерпретатор, system] (http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual023.html) –

+0

Интересует: [разность поведенческих различий по модулю vs при использовании F # лямбда в качестве фактического аргумента формальному параметру, который ожидает System .Func] (http://stackoverflow.com/q/31712588/1243762) –

ответ

4

Я думаю, что термин верхнего уровня имеет различное значение в разных контекстах.

Вообще говоря, я бы использовал его всякий раз, когда у вас есть структура, позволяющая вложенности ссылаться на одну позицию сверху, которая не вложена ни в что другое.

Например, если вы сказали, «круглые скобки верхнего уровня» в выражении, он будет ссылаться на внешнем большинстве пары скобок:

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

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

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

Здесь nested вложен topLevel.

В F #, функции и значения определяются с помощью let могут появляться внутри модулей или внутри классов, что усложняет вещи немного - я бы сказал, что только те внутренние модули верхнего уровня, но это, вероятно, только потому, что они являются общедоступными по умолчанию.

do ключевого слово работает аналогично - вы можете вложить его (хотя почти никто не делает), и поэтому верхний уровень do, что позволяет STAThread атрибут является тот, который не вложен в другой do или let:

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

Bud не допускается на любом do вложенного другого выражения:

do 
    [<STAThread>] 
    do 
    printfn "Hello!" 
    printfn "This is odd notation, I know..." 
Смежные вопросы