Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 函数执行顺序_F# - Fatal编程技术网

F# 函数执行顺序

F# 函数执行顺序,f#,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 * i

试图了解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
(第一次
%
调用的结果)需要进行第二次调用。

您可以通过逐步减少表达式来跟踪函数的执行(这是理解来自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
(第一次
%
调用的结果)需要打第二个电话。

我不明白你的问题<代码>%是,我相信您已经知道,所以我不确定您所说的“如何评估”是什么意思。代码是在线文章中的参考,我认为不需要x%y来计算所需的结果。我不理解您的问题
%
是,我相信您已经知道,所以我不确定您所说的“如何评估”是什么意思。code是在线文章中的参考,我认为不需要x%y来计算所需的结果