F#的条件表达式需要检查的条件,是否为true的分支以及是否为false的分支。例如:
let x =
if ("hello" = null)
then true
else false //error if else branch missing
但是,当涉及到
unit
,又名()
时,事情变得很奇怪。let y =
if ("hello" = null)
then raise <| new ArgumentNullException()
else () //happy with or without else branch
更简单地说:
let z =
if ("hello" = null)
then ()
else () //happy with or without else branch
为什么返回
else
时不需要unit
分支?
最佳答案
考虑以下代码:
let f a = if a > 5 then true
如果调用
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
有了这样的语句,就没有歧义:众所周知,
else
分支也打算返回()
。毕竟,unit
没有其他值了吗?同时,始终在末尾添加else ()
会非常麻烦且令人困惑。因此,出于可用性的考虑,在这种特定情况下,编译器不需要else
分支。
关于F#条件表达式,如果...则..else返回单位或(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51326439/