2010-09-30 55 views
3

非常多的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是一个浮动。这就说得通了。当用逗号分隔参数调用时,availableCapital是(float - > float - > float)* float * float。我一点都不明白。我在做什么?

回答

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

是含有作为Basics01.AvailableCapital floats.[0]作为第二元件其第一个元素floats.[1]floats.[2]作为第三元素的3元组。

3

阅读这样的:

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

所以availableCapital第一个组件是希望两个参数的部分应用功能。

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

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

,并得到一个类型错误。

2

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

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

F# function types: fun with tuples and currying

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

+0

感谢您的链接! – 2010-09-30 19:33:59

相关问题