繁体   English   中英

为什么F#failwith返回泛型类型而不是Exception类型

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

根据文档 ,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被期望而不是Exception因为第一个分支的计算结果为int 但是因为failwith返回一个'a而不是,它被推断为一个int本身,一切都很好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM