Вы можете отслеживать выполнение функции, постепенно сокращая выражение (это очень полезный способ понимания выполнения, которое исходит из 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
вызова.