根据文档,failwith 函数返回一个Exception
但是函数签名是string -> 'a
为什么没有签名string -> Exception
?
文档没有说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
本身,一切都很好。