7

当人们谈论 F# 时,他们有时会提到这个词top-level

是什么top-level意思?

例如在之前的 SO Q&A

错误 FS0037 有时,非常令人困惑
定义模块 VS.NET 与 F# 交互 F#
中的命名空间和模块有什么区别?
F# F# 和 MEF 中的 AutoOpen 属性
:导出函数 如何执行此 F# 函数

该术语也经常出现在评论中,但对于那些 Q&A 我没有引用它们。

关于范围的维基百科文章涉及到这一点,但没有关于 F# 的细节。

F# 3.x 规范仅声明:

11.2.1.1 函数和值的 Arity 一致性

括号表示一个top-level函数,它可能是计算为函数值的一等计算表达式,而不是编译时函数值。

13.1 自定义属性

例如,STAThread 属性应该放在top-level“do”语句之前。

14.1.8 类型变量的名称解析

top-level对于包含表达式和类型的任何成员或任何其他构造,它最初为空。

我怀疑这个术语在不同的上下文中有不同的含义:Scope、F# interactive、shadowing。

如果您还可以解释 F# 前身语言(ML、CAML、OCaml)的起源,我们将不胜感激。

最后,我不打算在几天内将答案标记为已接受,以避免仓促回答。

4

1 回答 1

4

我认为顶级一词在不同的上下文中具有不同的含义。

一般来说,只要您有一些结构允许嵌套引用顶部的一个位置,该位置没有嵌套在其他任何位置,我就会使用它。

例如,如果您在表达式中说“顶级括号”,它将指的是最外面的一对括号:

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

当谈到 F# 中的函数和值绑定(和范围)时,它指的是未嵌套在另一个函数中的函数。所以模块内的函数是顶级的:

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

在这里,nested嵌套在topLevel.

在 F# 中,使用定义的函数和值let可以出现在模块内部或类内部,这使事情有点复杂——我想说只有模块内部的那些是顶级的,但这可能只是因为它们默认是公共的。

关键字的工作方式类似 - 您可以嵌套它(尽管几乎没有人这样做),因此允许属性的do顶级是不嵌套在另一个或:doSTAThreaddolet

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

Bud 不允许在任何do嵌套在另一个表达式中:

do
  [<STAThread>] 
  do 
    printfn "Hello!"
  printfn "This is odd notation, I know..."
于 2016-04-08T19:31:12.067 回答