F#类型不正确,函数调用中的类型不正确

0 f#

不确定这段代码有什么用处.我想使用它作为主要函数来打印字符串或返回不足的参数.在这种情况下,这个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"]
Run Code Online (Sandbox Code Playgroud)

Fyo*_*kin 6

即使你没有指定你得到什么错误以及它出现在哪里(请在提问时总是这样做),我可以看到你的代码有什么问题:你把argv它看作是一个List但是一个.NET程序条目point必须接受类型的参数Array- 特别是字符串数组 - string[].

如果切换出来List.lengthArray.length,该函数将编译.

[<EntryPoint>]
let main argv =
  if (Array.length argv) >= 1 then
      printfn "Hello %s" argv.[0]; 0
  else
      printfn "Not enough arguments"; 1 
Run Code Online (Sandbox Code Playgroud)

现在,如果要调用此函数,则需要提供一个数组的参数,而不是List.在F#中,括号用于表示列表.如果要表示数组,则需要使用括号管道:

main [| "Test |]
Run Code Online (Sandbox Code Playgroud)

编辑回应评论:

通常,您不需要显式"调用"入口点函数.入口点是程序的"开始",没有其他函数调用它.这就是入口点函数必须是程序的最后一个文件中的最后一个函数的原因.如果在入口点之后放置任何代码,编译器将给出错误.
你写这个电话的方式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 
Run Code Online (Sandbox Code Playgroud)

看看:这样,程序实际上变得更有效了.如果你仔细观察,你会注意到你的原始程序接受任意数量的参数,但实际上只使用第一个参数.这是有点"不干净",所以说.使用模式匹配的上述版本做得更好:它将使用与其函数所需的完全相同的参数,否则将打印错误消息.