试图了解执行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)
>
答案 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
来电的结果)。