F# 函数执行顺序
试图了解f#代码下面的哪个顺序被执行,以及x%y是如何计算的 函数将以小时数表示的持续时间转换为由周、天和小时组成的三元组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
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来计算所需的结果