这可能很简单,但我有一个带有简单示例函数的.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 次 |
最近记录: |