如何使用 F# 将 int 插入到字符串中?

How to interpolate an int into a string with F#?

我正在尝试应该是一个真正基本的示例应用程序,但是来自 MS F# intro 的这个特定示例在智能感知中产生了这个警告:

Type mismatch. Expecting a
    ''a -> int'    
but given a
    ''a -> unit'    
The type 'int' does not match the type 'uint'F# Compiler1

来自这段代码:(顺便说一句,我已经尝试了 sum 的隐式和显式键入)

open System

[<EntryPoint>]
let main argv =
    printfn "Welcome to the calculator program"
    printfn "Type the first number"
    let firstNo = Console.ReadLine()
    printfn "Type the second number"
    let secondNo = Console.ReadLine()
    printfn "First %s, Second %s" firstNo secondNo
    let sum: int = 0
    printfn "The sum is %i" sum

然后当我编译时,我得到了这个错误,正如预期的那样,基于警告:

error FS0001: Type mismatch. Expecting a↔    ''a -> int'    ↔but given a↔    ''a -> unit'    ↔The type 'int' does not match the type 'unit' [C:\Users\user-name\source\repos\MyFSharpApp\MyFSharpApp.fsproj]

作为 F# 的新手,我不确定为什么 printfn 函数认为 int 是一个单元并破坏了编译。真的可以使用解释 and/or link(s) 来记录为什么会这样以及如何解决它。


编辑

有趣的一点是,即使我一起删除插值并只打印一个字符串,我也会得到同样的错误。所以根本没有 int,但是字符串需要一个 int 而不是一个单位……但是,为什么呢?我猜我有某种语法错误,尽管这看起来很奇怪。

main函数应该return一个int,这将成为程序执行的结果。惯例是:零表示成功,非零表示错误代码(这不是特定于 F# 的)。

当您使用 dotnet new 创建新项目时,如练习所示,将生成 main 函数 return 零。

但是正如您在评论中确认的那样,您的 main 函数目前没有零,这可能意味着您不小心删除了它。

只需重新添加零,错误就会消失。


在闪亮的新 .NET 6 中,默认生成器生成 an implicit entry point 而不是好的 ol' main 函数,在这种情况下不需要 return 值,并且如果你确实想要return一个,你必须使用exit函数。

但是,这显然不适用于当前问题,因为 OP 的生成器生成了一个 main 函数,而不是隐式入口点。