【问题标题】:How to interpolate an int into a string with F#?如何使用 F# 将 int 插入到字符串中?
【发布时间】:2021-12-22 15:03:31
【问题描述】:

我正在尝试应该是一个非常基本的示例应用程序,但是来自 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 是一个单元并且会破坏编译。真的可以使用解释和/或链接到文档来说明为什么会这样以及如何解决它。


编辑

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

【问题讨论】:

  • 在添加练习中的代码时,您是否有机会删除了 main 末尾的零?
  • main 函数应返回int(0 表示成功),因此给定签名'a -&gt; int。只需在函数末尾添加一行仅包含 0 的行(当前返回 unit)。
  • @FyodorSoikin 和 Romain Deneau,你们都是正确的,缺少零。该教程没有显示零,我想我在没有意识到的情况下复制了它或删除了它。如果你们中的一个人想用例子来解释为什么需要这样的答案,我认为这会帮助其他犯这个简单错误的新手。谢谢!

标签: .net f# typing


【解决方案1】:

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

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

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

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


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

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

【讨论】:

  • 不,如果您执行dotnet new console -lang F#,您将不再获得具有显式入口点的旧模板,但会显示here。因此,如果您可以仅引用显式入口点而​​不是模板,那就太好了。
  • 不完全正确@BrentTranberg。在我的安装(.NET 5)上,它确实生成了一个 main 函数,因此它对 OP 也是如此,从他们的问题来看。不过,我对答案做了一些澄清。
  • 感谢您添加澄清编辑。一个jsuk,我从教程中复制了主要功能,因为模板只给了我一个printfn,因为我正在运行VS 2022 + .NET 6
猜你喜欢
  • 2017-06-13
  • 2021-04-23
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 2020-02-02
  • 2021-12-18
  • 2017-03-21
  • 1970-01-01
相关资源
最近更新 更多