为什么SML不允许if-then而不是其他?

时间:2013-11-08 00:00:47

标签: functional-programming sml conditional-statements

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

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

4 个答案:

答案 0 :(得分:10)

Standard ML程序是表达式,而非语句

  

标准ML是一种功能性编程语言,具有一些不纯的功能。用标准ML编写的程序包含要评估的表达式,而不是语句或命令[在C语言中找到] ..

因此,因为if-then-else表达式,所以它必须求值为一个值。如果不需要else,那么如果条件失败,表达式将实际上“没有值” - 但是通过表达式的定义,必须具有值。要求显式else确保表达式在两种情况下都将评估为值 1

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

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


1 并非所有类似功能的语言都需要明确的then表达式,有些语言默认为特定值。但是,这就是它在SML中的工作原理,因为不需要任何特定类型的“默认值”,因此必须统一结果类型。

答案 1 :(得分:4)

这不是标准ML特有的; if-then-else表达式的许多或大多数语言都需要一个else-expression。例如,在类C语言(C,C ++,C#,Java,D,Perl,JavaScript,PHP等)中,表达式采用cond ? expr_if_true : expr_if_false形式;在Visual Basic中,Iif函数需要expression-if-true和expression-if-false;等等。 (有些语言,例如Excel公式语言,不需要两个值,并用else-expression替换默认值,但SML在不这样做的情况下也不例外。)

  

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

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

如果要在条件为真时执行某个操作,并且在条件为假时不执行任何操作,则只需使用条件表达式,其中只有then-expression具有副作用。例如:

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

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

答案 2 :(得分:0)

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

如果你想要那样做,那么你就让你的“其他”做一些事情,只传递给函数的其余部分。

我实际上对SML了解不多,所以我无法告诉你如何做到这一点

答案 3 :(得分:0)

因为否则,如果if分支不匹配,表达式的值是多少?为了不需要else分支,可以推断出默认值。我认为唯一可能有意义的是提出异常。可能是SML设计的一个选项,但这不是也不会有任何相关性。

每当您觉得else上没有有效的表达式值时,请说出类似的内容:

val x = 
   if condition then expression 
   else raise Domain;
相关问题