gpt4 book ai didi

F# 在 If/Then 中推断类型

转载 作者:行者123 更新时间:2023-12-04 05:26:04 27 4
gpt4 key购买 nike

如果我有以下功能:

let myFunc x y =
if y = 0 then 1
x

我收到错误:
Program.fs(58,17): error FS0001: This expression was expected to have type
unit
but here has type
int

为什么编译器期望 'unit' 而不是 int ?

最佳答案

值得补充的是,这不仅仅是 if 的属性。 . F# 是一种基于表达式的语言,这意味着几乎每一段代码(除了类型声明和一些异常(exception))都是一个计算结果的表达式。事实上,F#不会调用if if 语句,但是一个 if 表达式。

这意味着您可以使用 if在意想不到的地方。例如,这可能很有用:

x/2 + (if x%2=0 then 0 else 1) 

正如 Garry 已经解释过的,如果您省略 else ,那么表达式仍然需要返回一些东西 - 如果结果是 int ,那么它就没有意义(编译器应该选择哪个数字?),因此它要求结果的类型为 unit ,这是一种特殊类型,表示“无结果”。
unit type 也是所有命令式函数(例如 printf )或所有逻辑上不返回任何值(赋值或例如循环)的表达式的结果。这意味着如果你写:
if x > 0 then printfn "Big!"

... 那么表达式是类型良好的,因为 printfn "Big!"有一个返回类型 unit和隐式添加的 else分支也返回 unit .您可以创建类型为 unit 的值直接手动(类型只有一个值),所以上面实际上对应于:
if x > 0 then printfn "Big!" else ()

从 C# 的角度来看,阅读 if .. then .. else 更有意义。作为条件运算符:
x/2 + (x%2 == 0 ? 0 : 1)

关于F# 在 If/Then 中推断类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16487644/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com