为什么F#failwith返回通用类型而不是异常类型

时间:2019-06-23 07:55:11

标签: exception f# fsi

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

为什么签名不是string -> Exception

1 个答案:

答案 0 :(得分:9)

文档没有说failwith返回Exception。它说它生成一个F#异常。异常系统与返回值的常规控制流是分开的。因此,名称为 exception

当“抛出”(我认为这比文档中使用的“生成的”这个词要模糊的术语)少时,异常会在堆栈中向上传播,直到遇到处理这种特殊类型的try ... with构造异常,否则将终止程序。有关详细信息,请参见the F# docs on exception handling

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

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

如果failwith返回了Exception,则编译器将在这里抱怨期望的是int而不是Exception,因为第一个分支的值为{{1} }。但是由于int会返回failwith,因此可以推断为'a本身,一切都很好。