功能执行顺序

时间:2011-04-24 19:24:58

标签: f#

试图了解执行f#代码以下的顺序以及如何评估x%y

函数将给定为小时数的持续时间转换为由数周,小时和小时组成的三元组。

let hours2weeks (h : int) =
    let divAndRem x y = (x/y, x%y)
    let (w, h) = divAndRem h (7*24)
    let (d, h) = divAndRem h 24
    (w, d, h)


val hours2weeks : int -> int * int * int

> hours2weeks 1728
val it : int * int * int = (10, 2, 0)
> 

1 个答案:

答案 0 :(得分:4)

您可以通过逐步减少表达式来跟踪函数执行(这是了解Haskell执行的一种非常有用的方法,通过计算称为计算)。

调用函数时:

hours2weeks 1728

F#评估参数,然后开始评估正文:

let (w, h) = divAndRem 1728 (7*24)
let (d, h) = divAndRem 1728 24
(w, d, h)

它开始评估let的参数。首先,它评估divAndRem

的参数
let (w, h) = divAndRem 1728 168
let (d, h) = divAndRem 1728 24
(w, d, h)

然后使用指定的参数调用divAndRem函数:

let (w, h) = (1728/168, 1728%168)
let (d, h) = divAndRem h 24
(w, d, h)

评估`divAndRem的主体,它给出一个带有两个数字的元组:

let (w, h) = (10, 48)
let (d, h) = divAndRem h 24
(w, d, h)

然后F#将值分配给变量并继续:

let (d, h) = divAndRem 48 24
(10, d, h)

同样评估对divAndRem的第二次调用:

let (d, h) = (2, 0)
(10, d, h)

所以你得到:

(10, 2, 0)

现在,您可以使用此分步评估来确定结果中的0值来自第二次%调用中对divAndRem的评估以及该值进行第二次48电话需要%(第一次divAndRem来电的结果)。