Bre*_*rry 6 null f# expression conditional-operator nothing
F#的Condtional表达式需要检查条件,分支为true,分支为false.例如:
let x =
if ("hello" = null)
then true
else false //error if else branch missing
Run Code Online (Sandbox Code Playgroud)
然而,当事情会很奇怪unit,又名(),参与.
let y =
if ("hello" = null)
then raise <| new ArgumentNullException()
else () //happy with or without else branch
Run Code Online (Sandbox Code Playgroud)
而且更简单:
let z =
if ("hello" = null)
then ()
else () //happy with or without else branch
Run Code Online (Sandbox Code Playgroud)
返回else时为什么不需要分支unit?
请考虑以下代码:
let f a = if a > 5 then true
Run Code Online (Sandbox Code Playgroud)
如果你打电话f 10,它会返回true.
现在,问问自己:应该f 2返回什么?我知道你会说false,但编译器怎么知道呢?我的意思是,true在两种情况下,你的意思都是可能的,不是吗?或者甚至,也许,崩溃的a <= 5情况下,谁知道?
因此,为了使程序"完整"(即包含在每种情况下应该做什么的说明),您总是必须指定一个else分支.
unit然而,这很特别.
返回unit意味着没有有意义的返回值.基本上unit代表副作用:它意味着返回它的东西意味着在外部世界中产生一些效果.由于F#不是一种纯粹的语言,因此这种unit令人遗憾的事物无处不在.例如,调试日志记录:
let f x =
if x < 42 then printfn "Something fishy, x = %d" x
x + 5
Run Code Online (Sandbox Code Playgroud)
有了这样的陈述,就没有含糊之处:人们总是知道else分支也要返回().毕竟,没有其他价值unit,是吗?与此同时,总是else ()在最后添加会非常烦人和混淆.因此,为了可用性,编译器else在这种特定情况下不需要分支.
小智 5
在 F# 中if是表达式而不是语句。每个表达式都需要返回一个值。而且两者if并else需要返回同一类型的值,因为F#是强类型语言。因此,如果没有else分支,则默认情况下它具有 type unit,但是如果您if返回的值的类型不是unit,那么您需要具有else相同类型的an 。