为什么 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
本身,一切都很好。
根据 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
本身,一切都很好。