多年前,当我开始编写OO编程时,我得到的印象是变量(如果这是正确的词)是"基元"(int,double等)或第一类对象(String,JPane等).最近关于Java和C#中的原语的回答进一步证实了这一点(@Daniel Pryden:Java和C#中的原始类型是不同的吗?).但是不知道C#ValueTypes是基元,对象还是其他一些野兽,比如二等对象.我看到SO只使用了一个first-class标签,所以它可能不再是一个有用的术语.
我没有发现维基百科的文章有用("这篇文章需要关于这个主题的专家的关注.").我要感谢分类和当前使用的术语,主要与Java和C#有关(尽管其他语言可能会有所启发).
澄清:我想理解一流的术语以及它的使用范围.
如果我定义一个简单的函数:
let myConcat a b =
a + "+" + b
Run Code Online (Sandbox Code Playgroud)
然后假设函数是F#中的第一类值,我希望能够myConcat像这样使用:
let result = myConcat "a" (fun () -> "b")
Run Code Online (Sandbox Code Playgroud)
它没有产生字符串"a + b",而是给出了以下错误:
error FS0002: This function takes too many arguments, or is used in a context where a function is not expected
Run Code Online (Sandbox Code Playgroud)
希望我只是让语法错误,但在我看来,函数不能真正用作F#中的值.谁能解释一下这里发生了什么?
编辑 为了进一步澄清我的要求,我可以拥有等效的C#代码:
public string myConcat(string a, string b) { return a + "+" + b; }
Run Code Online (Sandbox Code Playgroud)
如果我想在param b中传递"稍后调用函数",我必须这样做:
public string myConcat(string a, Action<string> b) { return a + "+" + b(); }
Run Code Online (Sandbox Code Playgroud)
或者我可以这样称呼它: …
var a = 1;
function b() {
function a() {}; // local scope
a = 10; // global scope
}
b();
alert(a);
Run Code Online (Sandbox Code Playgroud)
它警告1而不是10.我想知道为什么会这样?