为什么 F# 会因 return 泛型而不是异常类型而失败

why does F# failwith return a generic type rather than Exception type

根据 docs failwith 函数 returns 一个 Exception 但是函数签名是string -> 'a

为什么签名不是string -> Exception

文档没有说 failwith return 是 Exception。它说它 生成 F# 异常。异常系统与 returning 值的正常控制流是分开的。因此得名,它是 exceptional.

异常,当 "thrown"(我认为这是一个比文档中使用的 "generated" 更明确的术语)时,将向上移动堆栈直到遇到 try ... with 构造处理这种特殊类型的异常,否则将终止程序。有关详细信息,请参阅 the F# docs on exception handling

failwith returns 'a 这样它就可以在任何地方使用,因为 'a 可以推断为任何东西。它可以伪装成 return 任何东西,因为它实际上从来没有 return ,与大多数函数不同,它总是抛出异常。如果它 returned Exception 它将只能用于预期计算结果为 Exception 的表达式,这是非常不寻常的,因为通常会抛出异常,而不是 return编辑。例如,给定:

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

如果 failwith 已 returned Exception,编译器会在这里抱怨自第一个分支以来期望 int 而不是 Exception计算结果为 int。但是由于 failwith return 是 'a,它被推断为 int 本身,一切都很好。