功能执行顺序
问题描述:
试图了解以何种顺序以下的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)
>
答
您可以通过一步一步的降低表达跟踪功能的执行(这对了解来自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
(第一个%
调用的结果)是nee德德做第二个divAndRem
电话。
+0
Coo ................ l – swapneel 2011-04-24 19:49:07
我不明白你的问题。 '%'是[算术模数运算符](http://msdn.microsoft.com/zh-cn/library/dd469493.aspx),因为我相信你已经知道了,所以我不确定你的意思通过“如何评估”。 – ildjarn 2011-04-24 19:32:15
代码是从网上文章的参考,我认为x%y不需要计算所需的结果 – swapneel 2011-04-24 19:42:11