порядок выполнения функции - PullRequest
0 голосов
/ 24 апреля 2011

пытается понять В каком порядке ниже выполняется код 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)
> 

1 Ответ

4 голосов
/ 24 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...