printfn при вызове вложенной функции ничего не печатает на консоли - PullRequest
0 голосов
/ 16 мая 2018

Ниже приведен код, написанный на языке F #:

let f () = 
    printfn "This function will print f"
    0

let xs (x) = 
    printfn "This function will print xs"
    f
    ()


[<EntryPoint>]
let main ( argv : string[]) =
    xs 4 |> ignore
    0

Когда я запускаю эту программу, я получаю только один оператор печати (присутствует в функции sx) на консоли:

Эта функция будет печатать xs

Оператор This function will print f, присутствующий внутри функции f, не печатается. Интересно, что когда я нажал F11 , чтобы войти в функцию f, во время отладки управление вообще не идет туда, даже если внутри функции f.

есть точка останова.

Интересно, что если я введу параметр в функцию f, то все это начнет работать. Поэтому, если я изменю функцию f на:

let f (x) = 
    printfn "This function will print f"
    0

let xs (x) = 
    printfn "This function will print xs"
    f 2
    ()


[<EntryPoint>]
let main ( argv : string[]) =
    xs 4 |> ignore
    0

Тогда этот оператор печати начинает работать:

Эта функция будет печатать f

Эта функция будет печатать xs

Может кто-нибудь объяснить это странное поведение? Я уверен, что упускаю что-то очень простое, связанное с миром F # или его функциональный аспект. У меня есть фон C #.

1 Ответ

0 голосов
/ 16 мая 2018

Вы не вызываете f, вы просто помещаете туда функцию, не задавая ей необходимые параметры.

Вот почему это работает, когда вы задаете ему параметр. Вы также должны сделать то же самое с пустыми скобками:

let xs (x) = 
    printfn "This function will print xs"
    f ()
    ()

Если вы хотите, чтобы конечный () выступал в качестве параметров для f, вам нужно добавить еще отступ:

let xs (x) = 
    printfn "This function will print xs"
    f
     ()
...