【发布时间】: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@.