简体   繁体   中英

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

According to the docs the failwith function returns an Exception But the function signature is string -> 'a

Why is the signature not string -> Exception ?

The docs don't say that failwith returns an Exception . It says it generates an F# exception. The exception system is separate from the normal control flow of returning values. Hence the name, it's exceptional .

Exceptions, when "thrown" (which is a less ambiguous term than "generated" as used in the docs, I think), will travel up the stack until encountering a try ... with construct that handles this particular type of exception, or if not will terminate the program. See the F# docs on exception handling for details.

failwith returns 'a so that it can be used anywhere, since 'a can be inferred to be anything. It can pretend to return anything because it never actually returns at all, unlike most functions, it always throws an exception instead. If it had returned Exception it would only be able to be used in expressions that are expected to evaluate to Exception , which are exceptionally unusual since exceptions are usually thrown, not returned. For example, given:

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

If failwith had returned Exception , the compiler would complain here about an int being expected instead of an Exception since the first branch evaluates to an int . But since failwith returns an 'a instead, it's inferred to be an int itself and everything is fine.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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