Functional programming 为什么';SML是否允许,如果,则不允许?

Functional programming 为什么';SML是否允许,如果,则不允许?,functional-programming,sml,conditional-statements,Functional Programming,Sml,Conditional Statements,在标准ML中,将if-then-else作为一个表达式,而不允许只使用if-then而不使用else子句的原因是什么 可以在SML中编写条件语句而不使用else子句吗?我理解您的意思,但是如果函数的“if”语句返回false,则程序不知道该做什么。如果表达式为false,您可能只希望函数继续运行……对吗 如果您希望发生这种情况,那么您必须让您的“else”执行一些传递给函数其余部分的操作 实际上,我对SML不太了解,所以我无法告诉您如何做到这一点程序是表达式,而不是语句 标准ML是一种函数式编程

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


可以在SML中编写条件语句而不使用else子句吗?

我理解您的意思,但是如果函数的“if”语句返回false,则程序不知道该做什么。如果表达式为false,您可能只希望函数继续运行……对吗

如果您希望发生这种情况,那么您必须让您的“else”执行一些传递给函数其余部分的操作

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

程序是表达式,而不是语句

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

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

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

也就是说,SML中的
if-then-else
类似于类C语言中的三元(
?:
)运算符,它也有这个“限制”。如果-语句的分支仅针对副作用进行评估,则不等同于



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

这不是标准ML特有的;具有if-then-else表达式的许多或大多数语言都需要else表达式。例如,在C语言(C,C++,C,java,D,perl,javascript,php等)中,表达式取的是代码<代码COND?expr_if_true:expr_if_false
;在Visual Basic中,
Iif
函数需要表达式(如果为真)和表达式(如果为假);等等(有些语言,如Excel formula语言,不需要两个值,并用默认值替换else表达式,但SML不这样做并不例外。)

是否可以在SML中不使用else子句编写条件语句

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

如果希望在条件为true时执行特定操作,而在条件为false时不执行任何操作,则只需使用条件表达式,其中只有then表达式具有副作用。例如:

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

(其中,
print“Yay!”
()
都是
unit
类型的表达式。)

因为如果不是这样,如果
如果
分支不匹配,表达式的值会是多少?要不需要
else
分支,需要可以推断出默认值。我认为唯一有意义的是提出一个例外。可能是SML设计的一个选项,但这不是,也不会有太大的相关性

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

val x = 
   if condition then expression 
   else raise Domain;

OCaml是SML的近亲,OCaml的if-then-else表达式几乎与SML相同。但是OCaml允许您没有
else
子句;它相当于
else()
。我想答案是,SML就是这样做的。@newact:对不起,我不知道你反对我答案的哪一部分。我所说的是,SML在要求
else
子句方面远远不是唯一的。我认为“然而,这就是它在SML中的工作方式”基本上就是你的答案。OCaml的功能与SML一样。但是它允许您省略
else
子句。显然,它的功能比SML“小得多”。