在标准 ML 中,将 if-then-else 作为单个表达式并且不允许仅 if-then 而没有 else 子句的原因是什么?
是否可以在没有 else 子句的情况下在 SML 中编写条件语句?
在标准 ML 中,将 if-then-else 作为单个表达式并且不允许仅 if-then 而没有 else 子句的原因是什么?
是否可以在没有 else 子句的情况下在 SML 中编写条件语句?
标准 ML程序是表达式,而不是语句。
标准 ML 是一种具有一些不纯特性的函数式编程语言。用标准 ML 编写的程序由要评估的表达式组成,而不是语句或命令 [在类 C 语言中发现] ..
因此,因为if-then-else
是一个表达式,它必须评估为一个值。如果else
不需要,那么如果条件失败,则表达式将有效地“没有值”——但根据表达式的定义,它必须有一个值。要求显式else
确保表达式在两种情况下都将评估为值1。
此外,then
andelse
表达式的类型必须统一——这将是整个if-then-else
构造的类型。
也就是说,if-then-else
在 SML 中就像?:
C 语言中的三元 ( ) 运算符,它也共享这个“限制”。它不是仅针对副作用评估其分支if
的等效语句。
1并非所有类似函数的语言都需要显式then
表达式,有些会默认为特定值。然而,这正是它在 SML 中的工作方式,这是有道理的,因为任何特定类型都不需要“默认值”,并且结果类型必须统一。
这不是标准 ML 特有的。许多或大多数带有 if-then-else 表达式的语言都需要 else 表达式。例如,在类 C 语言(C、C++、C#、Java、D、Perl、JavaScript、PHP 等)中,表达式采用; 在 Visual Basic 中,该函数需要一个表达式 if-true 和一个 expression-if-false;等等。(有一些语言,例如 Excel 公式语言,不需要这两个值,并用默认值代替 else 表达式,但 SML 几乎不例外。)cond ? expr_if_true : expr_if_false
Iif
是否可以在没有 else 子句的情况下在 SML 中编写条件语句?
SML 没有任何“语句”的概念,更不用说“条件语句”了。它有声明,但仅有条件地声明某些东西是没有意义的(因为类型信息都是在编译时确定的,而条件当然要到运行时才能评估)。
如果你想在条件为真时采取某种行动,而在条件为假时不采取行动,你只需要使用一个只有 then 表达式有副作用的条件表达式。例如:
val _ = if i > 30 then print "i is too big!" else ()
(其中print "Yay!"
和()
都是 type 的表达式unit
)。
我明白你在说什么,但如果你的函数的“if”语句返回 false,那么程序不知道该怎么做。如果表达式为假,您可能只是希望函数继续运行......对吗?
如果你想让这种情况发生,那么你让你的“else”做一些事情,只是传递给函数的其余部分。
我实际上对 SML 了解不多,所以我不能告诉你怎么做
因为否则,如果if
分支不匹配,表达式的值是多少?如果不需要else
分支,则需要可以推断出默认值。我看到的唯一有意义的事情是引发异常。本来可以作为 SML 设计的一个选项,但这不是也不会有很大的相关性。
每当您觉得 上没有有效的表达式值时else
,就这样说:
val x =
if condition then expression
else raise Domain;