2016-04-08 300 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元数为一致性功能和价值

括号中指明top-level功能,这可能是一个 一流的计算表达式计算出函数值 ,而不是编译时函数值。

13.1定义属性

例如,STAThread属性应立即放置 前top-level“做”的语句。对于类型变量

14.1.8名称解析

它为任何构件或任何其他构造top-level 包含表达式和类型最初是空的。

我怀疑这个词在不同的语境中有不同的含义: Scope,F#interactive,shadowing。

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

最后,我不打算标记答案为接受几天,以避免草率的答案。

+0

有关OCaml的兴趣:[顶层系统](http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual023.html) –

+0

感兴趣的内容:[模块与类型的行为差异使用F#lambda作为实际参数的形式参数,期望系统.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属性是不嵌套在另一个dolet之一:

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

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

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