这可能很简单,但我有一个带有简单示例函数的.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"?
你的当前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".
正如约翰所说,你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)
| 归档时间: |
|
| 查看次数: |
1088 次 |
| 最近记录: |