7

根据文档,failwith 函数返回一个Exception 但是函数签名是string -> 'a

为什么没有签名string -> Exception

4

1 回答 1

11

文档没有说failwith返回一个Exception. 它说它会生成一个 F# 异常。异常系统与返回值的正常控制流程是分开的。因此,它的名字,它是例外

异常,当“抛出”(我认为,这是一个比文档中使用的“生成”更明确的术语)时,将沿堆栈向上移动,直到遇到try ... with处理这种特定类型异常的构造,否则将终止程序。有关详细信息,请参阅有关异常处理的 F# 文档

failwith返回'a以便它可以在任何地方使用,因为'a可以推断为任何东西。它可以假装返回任何东西,因为它根本不会真正返回,与大多数函数不同,它总是抛出异常。如果它已返回Exception,则只能在预期评估为 的表达式中使用Exception,这是异常不寻常的,因为通常会抛出异常,而不是返回。例如,给定:

if i > 0 then
  i
else
  failwith "i is negative"

如果failwith已经返回Exception,编译器会在此处抱怨int 预期为 an 而不是 an,Exception因为第一个分支的计算结果为 an int。但是由于failwith返回 an'a而不是,它被推断为 anint本身,一切都很好。

于 2019-06-23T09:43:08.823 回答