Function 这是什么';()';什么意思?
我刚开始学法语。本书使用以下符号:Function 这是什么';()';什么意思?,function,f#,value-type,unit-type,Function,F#,Value Type,Unit Type,我刚开始学法语。本书使用以下符号: let name() = 3 name() 与此不同的是: let name = 3 name ?使用()创建一个函数,该函数采用类型为unit的参数,而不是第二种情况,它只是一个简单的整数 当您想要控制函数的执行时,这一点尤为重要 主要的区别在于你什么时候 let name() = printfn "hello" 1 vs 然后 将打印一次“hello”。但是 let t = (name()) + (name()) 将打印两次“he
let name() = 3
name()
与此不同的是:
let name = 3
name
?使用()
创建一个函数,该函数采用类型为unit
的参数,而不是第二种情况,它只是一个简单的整数
当您想要控制函数的执行时,这一点尤为重要
主要的区别在于你什么时候
let name() =
printfn "hello"
1
vs
然后
将打印一次“hello”。但是
let t = (name()) + (name())
将打印两次“hello”
在考虑函数求值的顺序时,必须小心这一点
考虑以下计划:
let intversion =
printfn "creating integer constant"
1
printfn "integer created"
let funcversion() =
printfn "executing function"
1
printfn "function created"
let a = intversion + intversion
printfn "integer calculation done"
let b = (funcversion()) + (funcveriosn())
printfn "function calculation done"
这将按顺序打印以下内容
name
是一个函数,类型为unit->int
在
name
是一个整数,类型为int
在F#中,每个函数都有一个输入类型和一个输出类型。let name()=3
的输入类型是单元
,它只有一个值()
。其输出类型为int
,其值从–2147483648
到2147483647
。作为另一个示例,类型bool
只有两个值,true
和false
回到你的问题上来,()
的用法是什么。如果不指定函数的输入值,则无法执行该函数。因此,您必须为函数指定一个输入值let name()=3
,才能执行该函数。由于其输入类型为unit
,因此您只能使用()
下面是定义名称函数的另一种方法:
let name : (unit -> int) = (fun _ -> 3);;
并将其与:
let name : int = 3
绝对不要把
()
看作函数调用或类似的语法。它只是一个值,比如3,5,'q',false,或“blah”。它恰好是一个Unit类型的值,实际上它是Unit类型的唯一值,但实际上这并不重要<代码>()这里只是一个值。我怎么强调都不过分
首先考虑
let name x = 3
这是什么?这只是在x上定义了一个函数,其中x可以是任何类型。在C#中,这将是:
int Name<T>(T x)
{
return 3;
}
或者,更简单地说
int Name(Unit x)
{
return 3;
}
因此我们看到,alllet name()=3
是一个函数的定义,它接受一个Unit
参数,并返回3,就像上面的C版本一样
然而,如果我们看一下
让name=3
,那么这只是一个变量定义,就像C#中的var name=3
。在回答()
是什么之前,让我们先定义一些基础知识并完成一些示例
在F#中,a有一个名称、零个或多个参数和一个表达式
为了保持简单,我们将使用:如果没有参数,则let语句为。
如果有参数,则let语句是一个 对于值,表达式的结果只计算一次并绑定到标识符;它是不可变的。
对于函数,每次调用函数时都会对表达式求值 所以这个值
let a = System.DateTime.Now;;
将始终具有第一次计算或稍后调用它的时间,即
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 ...
而这个功能
let b () = System.DateTime.Now;;
每次评估时都会有一个新的时间,即
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 ...
现在解释一下()
的含义。请注意,System.DateTime.Now
不需要参数即可工作
当表达式不需要参数时,我们如何创建函数
每个参数都必须有一个类型,因此F#对于不需要参数的函数具有相同的值,而单位类型的唯一值是()
这是一个函数,有一个参数x
,类型为int
let c x = x + 1;;
这是一个函数,有一个参数()
,类型为unit
let b () = System.DateTime.Now;;
我想我需要更多的例子。现在还不太清楚为什么它如此重要。不管怎样,那是什么
;1
for?我将添加更多示例。;1
us相当于一个换行符,然后是一个1,因此有一个返回值。我只是把它放在Brevity里,我不明白为什么如果刚刚定义了它,“创建整数常量”会被打印出来。哦。。虽然intversion
只存储1
,但它是作用域的一部分,因此它是沿着intversion
定义执行的吗?@Fabricio这是正确的-要在intversion中存储1,编译器必须运行1
之前的任何命令,这可能会在到达1之前产生副作用。简单地说,这只是一个没有参数的调用函数的F#形式吗?@Fabricio-Yes。但我必须添加一些内容,以超过15个字符的最小评论。@Fabricio:我不会这么说b
这里有一个函数,它接受一个参数:unit
。如果尝试在没有括号的情况下调用它,则会得到函数值b
,而不是b
函数的结果。尝试让d=b;;d()额外关注的FSI中的代码>:
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 ...
let b () = System.DateTime.Now;;
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 ...
let c x = x + 1;;
let b () = System.DateTime.Now;;