2011-04-24 78 views
0

试图了解以何种顺序以下的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

我不明白你的问题。 '%'是[算术模数运算符](http://msdn.microsoft.com/zh-cn/library/dd469493.aspx),因为我相信你已经知道了,所以我不确定你的意思通过“如何评估”。 – ildjarn 2011-04-24 19:32:15

+0

代码是从网上文章的参考,我认为x%y不需要计算所需的结果 – swapneel 2011-04-24 19:42:11

回答

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(第一个%调用的结果)是nee德德做第二个divAndRem电话。

+0

Coo ................ l – swapneel 2011-04-24 19:49:07