首页 文章

何时在f#中调用函数时使用括号?

提问于
浏览
3

我正在学习f#,我知道你在调用函数时不需要使用括号 .

防爆

let addOne arg1 =
    arg1 + 1

addOne 1

VS

this.GetType()

为什么我必须在第二个函数上使用括号?

1 回答

  • 10

    在涉及参数时,使用.NET库和使用F#库之间存在一些不匹配,但您通常可以将 () 视为括号,但是作为 unit 类型的特殊值,这意味着"no useful information" .

    这意味着当你说:

    addOne 1
    

    您正在使用值 - 数字1 - 调用 addOne 作为参数 . 现在,当您将相同的读数应用于第二个示例时:

    this.GetType()
    

    您可以将其视为使用值调用 this.GetType - 特殊的 () 单位值作为参数 . 如果你想保持一致,你也可以用空格写这个:

    this.GetType ()
    

    实际上,大多数人在调用.NET库时都会省略空间 . 当你不写空格时,F#也支持方法链接,所以你可以写例如 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") ,因此您可以将方法调用视为接受元组的普通调用:

    some.Operation (10, "Hello")
    

    同样,通常你不会在这里写空间,因为你知道这实际上是一个.NET方法调用,而不是“将元组传递给一个函数”,但从概念上讲,你可以用两种方式来思考它 .

    这是总结 - 有一些极端情况,方法调用实际上不像元组(例如,当涉及命名参数时),但这种思考方式应该让你了解事情是如何工作的 .

相关问题