【问题标题】:Why would a function signature have a unit parameter following other parameters?为什么函数签名会在其他参数之后有一个单位参数?
【发布时间】:2015-12-06 14:05:02
【问题描述】:

我正在看一个我在培训课程中看到的函数,无法理解以下函数末尾的“()”的用法:

let acclock (start:DateTimeOffset) rate () =
    let now = DateTime.Now
    let elapsed = now - start
    start.AddTicks (elapsed.Ticks * rate)

为什么函数签名会在其签名的其他参数末尾有一个单位参数?

因此,我认为单位参数意味着没有类似于“void”的参数或返回类型。

【问题讨论】:

  • 仅供参考;在像 F# 这样的 FPL 中,像 unit -> int 这样的函数意味着它是一个采用单位值的函数。不像它通常用类 C 语言解释;一个没有值的函数。对我来说,这是 FP 相对于类 C 语言的众多小好处之一。在 C# 中,您经常需要对 void 的情况进行特殊处理(例如 TaskTask<>)。在 F# 中,函数总是接受并返回一个值,对于 unit 值不需要特殊处理。之所以称为单元,是因为它映射到unit 类别,这是一个只有一个值的类别。

标签: f# unit-type


【解决方案1】:

这与部分应用有关。您可以将此函数绑定到另一个名称,同时提供startrate 参数,创建() -> DateTime 类型的函数。只有当您调用该函数时,您才会执行“elapsed = now - start”和“start.AddTicks”的计算。像这样:

let timeThis =
    let stopClock = acclock DateTime.Now 500
    doStuff ()
    stopClock () // The function is only executed now

如果末尾没有() 参数,则添加rate 值将直接执行该语句。

let acclock' (start:DateTimeOffset) rate =
    let now = DateTime.Now
    let elapsed = now - start
    start.AddTicks (elapsed.Ticks * rate)

let timeThis1 =
    let stopClock = acclock' DateTime.Now
    doStuff ()
    stopClock 500 // This is only executed now

// Or
let timeThis2 =
    let stopClock = acclock' DateTime.Now 500 // Wait, we calculated it immediately
    doStuff ()
    stopClock // This is just a value

【讨论】:

    【解决方案2】:

    使用附加的(),您可以传递startrate 参数并获得部分应用的函数unit -> DateTime

    let partiallyAppliedAcclock = acclock DateTime.Now 1L
    
    val partiallyAppliedAcclock : (unit -> System.DateTime)
    

    没有(),它将是DateTime 值。

    let acclockValue = acclock2 DateTime.Now 1L // acclock defined without ()
    
    val acclockValue : DateTime = 06-12-15 3:20:41 PM
    

    区别对于纯函数并不重要(你总是可以用它的值替换对纯函数的调用),但acclock 不是纯函数。它使用DateTime.Now,所以每次调用结果都会不同。

    【讨论】:

      猜你喜欢
      • 2015-06-19
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      相关资源
      最近更新 更多