【问题标题】:In F# what does top-level mean?在 F# 中,顶级是什么意思?
【发布时间】:2016-07-30 00:14:09
【问题描述】:

当人们谈论 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

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

scope 上的 Wikipedia 文章提到了这一点,但没有关于 F# 的详细信息。

F# 3.x 规范仅声明:

11.2.1.1 函数和值的 Arity 一致性

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

13.1 自定义属性

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

14.1.8 类型变量的名称解析

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

我怀疑该术语在不同的上下文中具有不同的含义: 范围、F# 交互式、阴影。

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

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

【问题讨论】:

标签: scope f# shadowing toplevel


【解决方案1】:

我认为顶级这个词在不同的语境中有不同的含义。

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

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

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

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

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

这里,nested 嵌套在 topLevel 中。

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

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

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

不允许在嵌套在另一个表达式中的任何do 上使用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多