不确定此代码有什么用处。我想使用它作为主要函数来打印字符串或返回不足的参数。在这种情况下,这个VS15的错误不是很有用。
[<EntryPoint>]
let main argv =
if (List.length argv) >= 1 then
printfn "Hello %s" argv.[0]; 0
else
printfn "Not enough arguments"; 1
main ["Test"]
答案 0 :(得分:6)
即使你没有指明你得到什么错误以及它出现在哪里(请在提问时总是这样做),我可以看到你的代码有什么问题:你正在将argv
视为好像是一个List
,但.NET程序入口点必须接受Array
类型的参数 - 特别是字符串数组 - string[]
。
如果为List.length
切换Array.length
,该函数将编译。
[<EntryPoint>]
let main argv =
if (Array.length argv) >= 1 then
printfn "Hello %s" argv.[0]; 0
else
printfn "Not enough arguments"; 1
现在,如果要调用此函数,您可能希望提供一个数组的参数,而不是List
。在F#中,括号用于表示列表。如果要表示数组,则需要使用括号管道:
main [| "Test |]
编辑回复评论:
通常,您不需要显式“调用”入口点函数。入口点是程序的“开始”,没有其他函数调用它。这就是入口点函数必须是程序的最后一个文件中的最后一个函数的原因。如果您在入口点之后放置任何代码,编译器将给您一个错误 您编写调用
main ["Test"]
的方式,我假设您只是想在F#interactive中执行此调用,这是一种在不构建和运行代码的情况下验证代码的常用方法。一旦准备好编译,就应该删除此调用。
最后,我想指出你实际上是在两次访问数组:首先检查它的长度,然后获取它的第一个项目。您可以使用模式匹配一步完成两个步骤:
[<EntryPoint>]
let main argv =
match argv with
| [|name|] -> printfn "Hello %s" name; 0
| _ -> printfn "Not enough or too many arguments"; 1
看看:这样,程序实际上变得更有效了。如果你仔细观察,你会注意到你的原始程序接受任意数量的参数,但实际上只使用第一个参数。这是有点“不干净”,所以说。使用模式匹配的上述版本做得更好:它将使用与其函数所需的完全相同的参数,否则将打印错误消息。