这个'()'符号是什么意思?

Fab*_*cio 9 f# function value-type unit-type

我刚开始学习F#.本书使用以下符号:

let name() = 3
name()
Run Code Online (Sandbox Code Playgroud)

与此不同的是:

let name = 3
name
Run Code Online (Sandbox Code Playgroud)

Guy*_*der 13

在回答什么()是让我们定义一些基础知识并完成一些例子之前.

在F#中,let语句有一个名称,零个或多个参数以及一个表达式.

为了保持这个简单,我们将使用:
如果没有参数,则let语句是一个.
如果有参数,则let语句是一个函数.

对于值,表达式的结果仅计算一次并绑定到标识符; 它是不可改变的.
对于函数,每次调用函数时都会计算表达式.

所以这个价值

let a = System.DateTime.Now;;
Run Code Online (Sandbox Code Playgroud)

将始终拥有首次评估或稍后调用的时间,即

a;;
val it : System.DateTime = 1/10/2017 8:16:16 AM ...  
a;;
val it : System.DateTime = 1/10/2017 8:16:16 AM ...  
a;;
val it : System.DateTime = 1/10/2017 8:16:16 AM ...  
Run Code Online (Sandbox Code Playgroud)

和这个功能

let b () = System.DateTime.Now;;
Run Code Online (Sandbox Code Playgroud)

每次评估时都会有新的时间,即

b ();;
val it : System.DateTime = 1/10/2017 8:18:41 AM ...  
b ();;
val it : System.DateTime = 1/10/2017 8:18:49 AM ...  
b ();;
val it : System.DateTime = 1/10/2017 8:20:32 AM ... 
Run Code Online (Sandbox Code Playgroud)

现在解释一下是什么()意思.请注意,System.DateTime.Now不需要工作的参数.

当表达式不需要参数时,我们如何创建函数?

每个参数都必须有一个类型,因此F#具有不需要参数的函数的单元类型,并且单元类型的唯一值是().

所以这是一个带有一个x类型参数的函数int

let c x = x + 1;;
Run Code Online (Sandbox Code Playgroud)

这是一个带有一个()类型参数的函数unit

let b () = System.DateTime.Now;;
Run Code Online (Sandbox Code Playgroud)


Dax*_*ohl 11

绝对不要将其()视为函数调用的某种语法或类似的东西.它只是一个值,如3,5,'q',false或"blah".它碰巧是一个类型的值,Unit实际上它是类型单位的唯一值,但实际上它不是重点. ()只是一个价值.我不能强调这一点.

首先考虑一下

let name x = 3
Run Code Online (Sandbox Code Playgroud)

这是什么?这只是在x上定义了一个函数,其中x可以是任何类型.在C#中将是:

int Name<T>(T x) 
{
    return 3;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我们看一下let name () = 3(我有点建议在那里放置额外的空间,所以它()看起来比某些语法结构看起来更有价值)然后在C#中你可以把它想象成(伪代码)

int Name<T>(T x) where T == Unit  //since "()" is the only possible value of Unit
{
    return 3;
}
Run Code Online (Sandbox Code Playgroud)

或者,更简单

int Name(Unit x)
{
    return 3;
}
Run Code Online (Sandbox Code Playgroud)

所以我们看到一切let name () = 3都是,带有Unit参数的函数的定义,并返回3,就像上面的C#版本一样.

但是,如果我们看一下let name = 3那只是一个变量定义,就像var name = 3在C#中一样.


Yin*_*Zhu 8

let name() = 3
name()
Run Code Online (Sandbox Code Playgroud)

name是一种类型的功能unit -> int.

let name = 3
name
Run Code Online (Sandbox Code Playgroud)

name是一个整数,类型int.

在F#中,每个函数都有一个输入类型和一个输出类型.输入类型let name() = 3unit,只有一个值().其输出类型是int,它从具有值–2,147,483,6482,147,483,647.另一个示例类型bool只有两个值,truefalse.

所以回到你的问题是什么的用法().如果未指定函数的输入值,则无法执行.因此,您必须为函数指定一个输入值以let name()=3使其执行,并且由于其输入类型unit,您可以使用的唯一值是().

这是定义名称函数的另一种方法:

let name : (unit -> int)  = (fun _ -> 3);;
Run Code Online (Sandbox Code Playgroud)

并将其与:

let name : int = 3
Run Code Online (Sandbox Code Playgroud)