IF条件下的VAL关键字不允许在SML中重新分配

时间:2012-12-28 14:45:29

标签: list sml smlnj

鉴于以下代码(不起作用):

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声明中。

  1. 我想在while循环中运行,我怎样才能在ML中执行此操作?

  2. 如何将值分配并重新分配给先前在ML中声明的变量?

  3. 在{IF}条件下,val关键字是不可能的,所以我无法更新变量,任何想法如何解决?

  4. 此致

1 个答案:

答案 0 :(得分:3)

  

如何将值分配并重新分配给变量   以前在ML中声明过吗?

在ML中声明变量后,您无法分配变量。

  

在IF条件下无法使用val关键字,所以我不能   更新变量,任何想法如何解决?

除了顶层,您通常在val内使用funlet

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循环的主体转换为尾递归辅助函数,并且在循环的迭代之间更改的“变量”将成为此函数的参数。它不是试图“设置”这些变量的值,而是简单地用下一次迭代的新值递归调用自身。如果它是尾递归的,它相当于迭代记忆。