为什么函数签名在其他参数之后会有一个单位参数?
Why would a function signature have a unit parameter following other parameters?
我正在查看我在培训课程中看到的函数,无法理解以下函数末尾的“()”的用法:
let acclock (start:DateTimeOffset) rate () =
let now = DateTime.Now
let elapsed = now - start
start.AddTicks (elapsed.Ticks * rate)
为什么函数签名在其签名的其他参数末尾有一个单位参数?
因此,我认为单位参数意味着没有参数或 return 类型类似于 "void"。
通过额外的()
,您可以传递start
和rate
参数并获得部分应用的函数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
,所以每次调用结果都会不同。
这与部分应用有关。您可以将此函数绑定到另一个名称,同时提供 start
和 rate
参数,创建类型为 () -> 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
我正在查看我在培训课程中看到的函数,无法理解以下函数末尾的“()”的用法:
let acclock (start:DateTimeOffset) rate () =
let now = DateTime.Now
let elapsed = now - start
start.AddTicks (elapsed.Ticks * rate)
为什么函数签名在其签名的其他参数末尾有一个单位参数?
因此,我认为单位参数意味着没有参数或 return 类型类似于 "void"。
通过额外的()
,您可以传递start
和rate
参数并获得部分应用的函数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
,所以每次调用结果都会不同。
这与部分应用有关。您可以将此函数绑定到另一个名称,同时提供 start
和 rate
参数,创建类型为 () -> 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