我正在学习f#,我知道你在调用函数时不需要使用括号 .
防爆
let addOne arg1 = arg1 + 1 addOne 1
VS
this.GetType()
为什么我必须在第二个函数上使用括号?
在涉及参数时,使用.NET库和使用F#库之间存在一些不匹配,但您通常可以将 () 视为括号,但是作为 unit 类型的特殊值,这意味着"no useful information" .
()
unit
这意味着当你说:
addOne 1
您正在使用值 - 数字1 - 调用 addOne 作为参数 . 现在,当您将相同的读数应用于第二个示例时:
addOne
您可以将其视为使用值调用 this.GetType - 特殊的 () 单位值作为参数 . 如果你想保持一致,你也可以用空格写这个:
this.GetType
this.GetType ()
实际上,大多数人在调用.NET库时都会省略空间 . 当你不写空格时,F#也支持方法链接,所以你可以写例如 foo().bar() .
foo().bar()
采用多个参数的许多F#函数将使用“curried”形式,这意味着参数需要用空格分隔 . 例如:
let add a b = a + b let mul a b = a * b add 10 (mul 20 3)
在这里,您需要围绕第二个表达式使用括号,以便编译器知道如何解析代码 . 这与典型的.NET方法形成对比,后者将参数作为元组 . F#元组写为 (10, "hello") ,因此您可以将方法调用视为接受元组的普通调用:
(10, "hello")
some.Operation (10, "Hello")
同样,通常你不会在这里写空间,因为你知道这实际上是一个.NET方法调用,而不是“将元组传递给一个函数”,但从概念上讲,你可以用两种方式来思考它 .
这是总结 - 有一些极端情况,方法调用实际上不像元组(例如,当涉及命名参数时),但这种思考方式应该让你了解事情是如何工作的 .
1 回答
在涉及参数时,使用.NET库和使用F#库之间存在一些不匹配,但您通常可以将
()
视为括号,但是作为unit
类型的特殊值,这意味着"no useful information" .这意味着当你说:
您正在使用值 - 数字1 - 调用
addOne
作为参数 . 现在,当您将相同的读数应用于第二个示例时:您可以将其视为使用值调用
this.GetType
- 特殊的()
单位值作为参数 . 如果你想保持一致,你也可以用空格写这个:实际上,大多数人在调用.NET库时都会省略空间 . 当你不写空格时,F#也支持方法链接,所以你可以写例如
foo().bar()
.采用多个参数的许多F#函数将使用“curried”形式,这意味着参数需要用空格分隔 . 例如:
在这里,您需要围绕第二个表达式使用括号,以便编译器知道如何解析代码 . 这与典型的.NET方法形成对比,后者将参数作为元组 . F#元组写为
(10, "hello")
,因此您可以将方法调用视为接受元组的普通调用:同样,通常你不会在这里写空间,因为你知道这实际上是一个.NET方法调用,而不是“将元组传递给一个函数”,但从概念上讲,你可以用两种方式来思考它 .
这是总结 - 有一些极端情况,方法调用实际上不像元组(例如,当涉及命名参数时),但这种思考方式应该让你了解事情是如何工作的 .