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#中一样.
在
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() = 3
是unit
,只有一个值()
.其输出类型是int
,它从具有值–2,147,483,648
到2,147,483,647
.另一个示例类型bool
只有两个值,true
和false
.
所以回到你的问题是什么的用法()
.如果未指定函数的输入值,则无法执行.因此,您必须为函数指定一个输入值以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)
归档时间: |
|
查看次数: |
409 次 |
最近记录: |