Functional programming 为什么';SML是否允许,如果,则不允许?
在标准ML中,将if-then-else作为一个表达式,而不允许只使用if-then而不使用else子句的原因是什么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是一种函数式编程
可以在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“小得多”。