【问题标题】:Why is return type of this expression calculated to return type unit-> int instead of int为什么此表达式的返回类型计算为返回类型 unit-> int 而不是 int
【发布时间】:2020-07-14 15:36:12
【问题描述】:

我是 F# 的新手,正在编写一个函数,以秒为单位将 dateTime 值转换为 unix 时间戳。 下面是我对这样一个函数的实现(只是使用内置函数并包装它以供学习)。

let DateTimeToUnix x =
        let result = DateTimeOffset(x).ToUnixTimeSeconds
        result

预期的返回类型是:DateTime -> int64 实际返回类型为:DateTime->(unit->int64)

我试图找到类似的问题,我找到的最接近的问题是这样的 (F# - The type int is not compatible with type unit) 但不幸的是,我不明白它在这种情况下如何适用,因为使用的函数 (ToUnixTimeSeconds) 的返回类型是 int64 而不是 (unit->int64)。

如果有人能指出从哪里了解这一点或能解释这种行为,那就太好了。非常感谢您的宝贵时间。

【问题讨论】:

    标签: f#


    【解决方案1】:

    ToUnixTimeSeconds 是一个方法,而不是一个属性。在 F# 中,方法被建模为函数。无参数方法被建模为具有单个 unit 类型参数的函数。所以foo.ToUnixTimeSeconds 的类型将是unit -> int64,就像编译器告诉你的那样。

    要实际调用该函数并从中获取结果,请为其提供所需类型的参数 - 即unit:

    let DateTimeToUnix x =
        let result = DateTimeOffset(x).ToUnixTimeSeconds ()
        result
    

    附带说明一下,您实际上不必将中间值命名为 result:

    let DateTimeToUnix x =
        DateTimeOffset(x).ToUnixTimeSeconds ()
    

    【讨论】:

      【解决方案2】:

      您必须在返回 ToUnixTimeSeconds 之前调用它才能获得所需的返回类型:

      let DateTimeToUnix x =
          let result = DateTimeOffset(x).ToUnixTimeSeconds() // invoke method: ()
          result
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        • 1970-01-01
        • 2022-07-22
        • 1970-01-01
        • 1970-01-01
        • 2020-06-05
        • 1970-01-01
        相关资源
        最近更新 更多