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