当我用逗号分隔args调用函数时发生了什么?

时间:2010-09-30 18:43:57

标签: f#

很多F#的新手,似乎无法让我的Google员工为这个问题工作。

我有这个功能

namespace RiskMeasurement
module Basics01 =
    let AvailableCapital (nominalAssetValue: float) (provisions: float) (liabilities: float) =
        nominalAssetValue - provisions - liabilities

调用
namespace RiskMeasurement
module Main =
    [<EntryPoint>]
    let main args =
        let floats = Array.map float args
        let availableCapital = Basics01.AvailableCapital floats.[0] floats.[1] floats.[2]
        printfn "Available Capital: %f" availableCapital

        let availableCapital = Basics01.AvailableCapital floats.[0], floats.[1], floats.[2]

        // Return 0 to indicate success.
        0

当我用空格分隔的args调用函数时,availableCapital是一个浮点数。那讲得通。当用逗号分隔args调用时,availableCapital是(float - &gt; float - &gt; float)* float * float。我根本不明白。我在做什么?

3 个答案:

答案 0 :(得分:3)

这样读:

let availableCapital = (Basics01.AvailableCapital floats.[0]), floats.[1], floats.[2]

因此availableCapital的第一个组件是部分应用的函数,它需要两个参数。

如果你想用逗号分隔的参数调用它,你可以写

let availableCapital = Basics01.AvailableCapital (floats.[0], floats.[1], floats.[2])

并获得类型错误。

答案 1 :(得分:2)

Basics01.AvailableCapital floats.[0], floats.[1], floats.[2]

是一个3元组,包含Basics01.AvailableCapital floats.[0]作为第一个元素floats.[1]作为第二个元素,floats.[2]作为第三个元素。

答案 2 :(得分:2)

其他一些好的答案已经存在;简而言之,'逗号运算符'在解析表达式时具有非常低的优先级。

既然你提到你是F#的新手,你可能想看看

F# function types: fun with tuples and currying

如果您需要了解f(x,y)f x y之间的区别。