F#条件表达式,如果...则..else返回单位或()

标签 f# null expression conditional-operator nothing

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/

相关文章:

c# - 从 F# 调用 C# 异步方法会导致死锁

c# - 有没有办法在以编程方式替换参数值后获取 CommandText?

javascript - 有没有办法使用 Javascript 将 ASP.Net 隐藏字段值设置为 NULL?

sql - 为什么 Oracle 9i 将空字符串视为 NULL?

java - 类型/表达式非法开始(括号放置帮助?)

.net - 如何在 F# 中声明可通过 WebJob 的 JobHost.CallAsync 调用的函数?

f# - 事件模式的重点是什么?

mysql - 如何在 MySQL 中将默认 Null 更改为 NOT NULL

css - 使用类似 “input[class~=”的有效“&& type =“checkbox”]?

java - 使用内置 JavaScript 引擎时自动为未定义的方法添加前缀 `Math.`?