鉴于以下代码(不起作用):
fun func() =
val decimal = 0 (* the final result *)
val multiple = 0 (* keeps track of multiples, eg. In XXV, X would be a multiple *)
val current = 0 (* the digit currently being processed *)
val top = 0 (* value of the last element in the list *)
val last_add = 0 (* the last digit that wasn't a multiple, or subtraction operation *)
val last_sub = 0
val problem = 0 (* if value is 1 then there is a problem with the input *)
val myList = [1,2,3,4,5] (* the list has more values *)
val current = tl(myList) (* grab the last element from the list *)
val myList = tl(myList) (* remove the last element from the list *)
val top = tl(myList) (* grab the value at the end of the list *)
while (not(myList = [])) (* run while the list is not empty *)
if ( (not(myList = [])) andalso (current > top))
then
val decimal = decimal + current - top
val last_sub = top;
val myList = tl(myList)
else
if ( (myList = []) andalso (current = top))
then val decimal = decimal + current
val multiple = multiple + 1
else
if (last_sub = current)
then val problem = 1
else
val decimal = decimal + current
val multiple = 0
val last_add = current
这只是部分代码,目前无效,因为val
不是
可能在if
声明中。
我想在while
循环中运行,我怎样才能在ML中执行此操作?
如何将值分配并重新分配给先前在ML中声明的变量?
在{IF}条件下,val
关键字是不可能的,所以我无法更新变量,任何想法如何解决?
此致
答案 0 :(得分:3)
如何将值分配并重新分配给变量 以前在ML中声明过吗?
在ML中声明变量后,您无法分配变量。
在IF条件下无法使用val关键字,所以我不能 更新变量,任何想法如何解决?
除了顶层,您通常在val
内使用fun
和let
:
let
val x = blah blah
val y = blah blah
fun f x y = blah blah
in
some expression
end
但是,请注意,这会创建一个 new 变量(可能会隐藏同名的任何现有变量),该变量存在于let主体的范围内。如前所述,您无法分配现有变量。
我想在while循环中运行,我怎么能在ML中执行此操作?
你快到了。语法为while condition do ( ... )
。但是没有可变状态,while循环是无用的。
如果您想要可变状态,可以使用可变数据结构。该语言提供了一个名为ref
的简单“可变单元格”:您可以通过将初始值传递给ref
函数来创建它,使用!
运算符获取当前值,然后设置使用:=
运算符的新值。您还必须记住,如果要运行多个命令性“语句”,则必须将它们与;
运算符分开,并且可能由于优先级问题将括号中的整个“块”语句括起来。
但是使用while循环和可变状态真的不是正确的方法。您使用的是函数式语言,将您的算法重新编写为纯函数会更好。这并不难。您可以将while循环的主体转换为尾递归辅助函数,并且在循环的迭代之间更改的“变量”将成为此函数的参数。它不是试图“设置”这些变量的值,而是简单地用下一次迭代的新值递归调用自身。如果它是尾递归的,它相当于迭代记忆。