当人们谈论F#时,他们有时会提到top-level
这个词;
top-level
是什么意思?
例如在之前的SO Q& A
中 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& A我没有引用它们。
关于scope的维基百科文章涉及到这一点,但没有F#的具体细节。
F#3.x规范仅声明:
11.2.1.1函数和值的Arity一致性
括号表示
top-level
函数,可能是a 计算函数值的第一类计算表达式, 而不是编译时函数值。
13.1自定义属性
例如,应立即放置STAThread属性 在
top-level
“做”声明之前。
14.1.8类型变量的名称解析
对于任何成员或任何其他
top-level
构造,它最初为空 包含表达式和类型。
我怀疑这个词在不同的语境中有不同的含义: 范围,F#互动,阴影。
如果您还可以解释F#前任语言(ML,CAML,OCaml)的起源,我们将不胜感激。
最后,我不打算将答案标记为接受几天以避免仓促答案。
答案 0 :(得分:4)
我认为 top-level 这个词在不同的语境中有不同的含义。
一般来说,每当你有一些结构允许嵌套引用顶部的一个没有嵌套在其他地方的位置时,我就会使用它。
例如,如果你在表达式中说“顶级括号”,它将引用最外面的一对括号:
((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!"
:
do
在嵌套在另一个表达式中的任何do
[<STAThread>]
do
printfn "Hello!"
printfn "This is odd notation, I know..."
上不允许使用它:
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>