Printfn值不是函数,不能在F#的交互窗口中应用

Cha*_*nya 2 f# fsi unit-type

这可能很简单,但我有一个带有简单示例函数的.fs文件.

let printHello = printfn "%A" "Hello"
Run Code Online (Sandbox Code Playgroud)

我已经使用了.fs文件的搜索路径

>#I "PathToMyFSFile"
Run Code Online (Sandbox Code Playgroud)

我已经加载了我的文件

>#load "Test.fs"
Run Code Online (Sandbox Code Playgroud)

哪个工作正常.现在我想调用实际打印hello到屏幕的功能,但事实证明这太难了

> Test.printHello;;
val it : unit = ()
Run Code Online (Sandbox Code Playgroud)

试过Test.printHello();; 同样但不起作用.我如何让它在屏幕上打印"Hello"?

Joh*_*mer 6

你的当前printHello实际上并不是一个功能.要使它成为您需要做的功能

let printHello() = printfn "%A" "Hello"
Run Code Online (Sandbox Code Playgroud)

吵闹().一切都应该有效.

编辑:

当编译器看到您的定义时

let printHello = printfn "%A" "Hello"
Run Code Online (Sandbox Code Playgroud)

它将其作为简单的数据术语传递.例如,考虑这个程序:

let printHello = printfn "%A" "Hello"
printfn "World"
printHello
Run Code Online (Sandbox Code Playgroud)

这将打印"Hello"然后"World". printHello只是有单位类型,所以什么都不做.比较它

let printHello() = printfn "%A" "Hello"
printfn "World"
printHello()
Run Code Online (Sandbox Code Playgroud)

printHello是一个功能.在这种情况下,当它被显式调用时才能执行的功能,所以这个版画"World"然后"Hello".


Tom*_*cek 5

正如约翰所说,你printHello不是一个功能 - 它是一种类型的价值unit.当你提供printfn所有必需的参数时(正如你所做的那样),它会执行命令操作并返回unit(这是一个只写入一个值的类型()).您可以看到编写该声明立即进行打印:

> let printHello = printfn "%A" "Hello";;
"Hello"
val printHello : unit = ()
Run Code Online (Sandbox Code Playgroud)

当您printHello稍后使用时,它只是引用此unit值(不携带任何信息).

如果你想让它成为一个函数(类型unit -> unit),每次执行它都会做某事,那么你可以使用John发布的样本.

该功能printfn部分应用,因为您为其提供了所需的所有参数(因此可以立即打印).如果您想使用部分应用程序,可以使用以下内容:

> let printHello = printfn "%s %s" "Hello";; // Note - didn't give value for second %s
val printHello : string -> unit
Run Code Online (Sandbox Code Playgroud)

现在printHello是一个等待第二个参数然后运行的函数:

> printHello "World";;
Hello World
val it : unit = ()

> printHello "F#";;
Hello F#
val it : unit = ()
Run Code Online (Sandbox Code Playgroud)