【问题标题】:What's happening when I call a function with args separated with commas?当我调用一个以逗号分隔的 args 函数时会发生什么?
【发布时间】:2017-01-22 23:52:46
【问题描述】:

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

我有这个功能

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

当我用空格分隔的参数调用函数时,availableCapital 是一个浮点数。那讲得通。当使用逗号分隔参数调用时,availableCapital 是 (float -> float -> float) * float * float。我完全不明白。我在做什么?

【问题讨论】:

    标签: f#


    【解决方案1】:

    这样读:

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

    所以availableCapital 的第一个组件是一个需要两个参数的部分应用函数。

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

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

    并得到一个类型错误。

    【讨论】:

      【解决方案2】:
      Basics01.AvailableCapital floats.[0], floats.[1], floats.[2]
      

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

      【讨论】:

        【解决方案3】:

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

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

        F# function types: fun with tuples and currying

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

        【讨论】:

          猜你喜欢
          • 2011-06-19
          • 2014-08-17
          • 2020-08-22
          • 1970-01-01
          • 1970-01-01
          • 2016-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多