【问题标题】:printfn in a nested function call is not printing anything on console嵌套函数调用中的 printfn 不在控制台上打印任何内容
【发布时间】:2018-05-16 14:57:48
【问题描述】:

我在下面提到了用 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

f 函数内部的声明 This function will print 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# 背景。

【问题讨论】:

  • 没有魔法发生。在您的第一个示例中,您定义了一个函数 f,它有一个单位参数 (),您应该像 f() 一样调用它。在您的第二个示例中,您使用其参数正确调用它。原因是你在f#中有自动柯里化,基本上f只是一个等待它输入的函数,你可以现在或以后提供它。
  • f 是一个函数,如果你想调用它,你必须写 f() 而不是 f
  • @FoggyFinder 哦!我想如果调用 f 2 有效,那么对于无参数函数,我应该简单地删除参数 2 并且事情应该可以工作。奇怪的是,为什么编译器在编译过程中没有报错?即使使用f 语句,它运行程序也没有任何错误。
  • 您也不需要添加显式返回值(如 0 或 ()),因为 F# 函数会自动返回最后计算的表达式,因为 print 语句是一个副作用,它将是单位 @ 987654335@.

标签: f# printf


【解决方案1】:

您没有调用f,您只是在其中放置了一个函数,而没有为其提供所需的参数。

这就是为什么当你给它一个参数时它会起作用。你也必须对空括号做同样的事情:

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

如果您希望最终的 () 充当 f 的参数,则必须添加更多缩进:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2018-05-17
    • 2020-10-07
    • 2015-12-11
    • 1970-01-01
    相关资源
    最近更新 更多