3

在标准 ML 中,将 if-then-else 作为单个表达式并且不允许仅 if-then 而没有 else 子句的原因是什么?

是否可以在没有 else 子句的情况下在 SML 中编写条件语句?

4

4 回答 4

10

标准 ML程序是表达式,而不是语句

标准 ML 是一种具有一些不纯特性的函数式编程语言。用标准 ML 编写的程序由要评估的表达式组成,而不是语句或命令 [在类 C 语言中发现] ..

因此,因为if-then-else是一个表达式,它必须评估为一个值。如果else不需要,那么如果条件失败,则表达式将有效地“没有值”——但根据表达式的定义,它必须有一个值。要求显式else确保表达式在两种情况下都将评估为值1

此外,thenandelse表达式的类型必须统一——这将是整个if-then-else构造的类型。

也就是说,if-then-else在 SML 中就像?:C 语言中的三元 ( ) 运算符,它也共享这个“限制”。它不是仅针对副作用评估其分支if的等效语句


1并非所有类似函数的语言都需要显式then表达式,有些会默认为特定值。然而,这正是它在 SML 中的工作方式,这是有道理的,因为任何特定类型都不需要“默认值”,并且结果类型必须统一。

于 2013-11-08T00:14:33.150 回答
4

这不是标准 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_falseIif

是否可以在没有 else 子句的情况下在 SML 中编写条件语句?

SML 没有任何“语句”的概念,更不用说“条件语句”了。它有声明,但仅有条件地声明某些东西是没有意义的(因为类型信息都是在编译时确定的,而条件当然要到运行时才能评估)。

如果你想在条件为真时采取某种行动,而在条件为假时不采取行动,你只需要使用一个只有 then 表达式有副作用的条件表达式。例如:

val _ = if i > 30 then print "i is too big!" else ()

(其中print "Yay!"()都是 type 的表达式unit)。

于 2013-11-08T00:27:39.920 回答
0

我明白你在说什么,但如果你的函数的“if”语句返回 false,那么程序不知道该怎么做。如果表达式为假,您可能只是希望函数继续运行......对吗?

如果你想让这种情况发生,那么你让你的“else”做一些事情,只是传递给函数的其余部分。

我实际上对 SML 了解不多,所以我不能告诉你怎么做

于 2013-11-08T00:13:56.860 回答
0

因为否则,如果if分支不匹配,表达式的值是多少?如果不需要else分支,则需要可以推断出默认值。我看到的唯一有意义的事情是引发异常。本来可以作为 SML 设计的一个选项,但这不是也不会有很大的相关性。

每当您觉得 上没有有效的表达式值时else,就这样说:

val x = 
   if condition then expression 
   else raise Domain;
于 2014-02-04T19:25:39.290 回答