SML/NJ中的循环

5 functional-programming sml

我对SNL/NJ很新,并且想知道如何完成以下任务:

foo(stuff,counter)
{
   while(counter > 0)
   {
     bar(stuff);
     counter-1;
   }
   return;
}
Run Code Online (Sandbox Code Playgroud)

像这样的东西,但我怎么减少?:

foo(stuff,counter) = 
   while counter > 0 do bar(stuff) ??? // how do I decrement counter here?
Run Code Online (Sandbox Code Playgroud)

new*_*cct 7

我同意其他贡献者一般应该使用递归而不是循环和变异来在函数式语言中执行此操作.

如果你真的想使用变异和循环,你需要使用一种称为引用的数据结构,它是一种"可变单元".您使用该ref函数分配引用,并将初始内容传递给它.您可以使用!操作员访问内容.然后使用:=运算符设置新内容.因此,上面代码的字面翻译将如下所示.正如您所看到的,语法非常难看,这也是人们避免使用它的另一个原因.

fun foo (stuff, counter_start) =
let
  val counter = ref counter_start
in
  while !counter > 0 do (
    bar stuff;
    counter := !counter - 1
  )
end;
Run Code Online (Sandbox Code Playgroud)


Nor*_*sey 6

在函数程序中,可变变量变为参数,通常是嵌套的辅助函数.

因为在你的例子中,被变异的东西是aleady参数,所以不需要辅助函数.你的代码变成了

fun foo stuff counter =
  if counter > 0 then
    ( bar stuff
    ; foo stuff (counter-1)
    )
  else
    ()
Run Code Online (Sandbox Code Playgroud)

当然这个代码仍然非常必要......这个调用bar stuff纯粹是为了副作用而执行的.不是ML-ish.


jal*_*alf 5

简短的回答:你没有.在函数式编程中,通常不会修改变量,这意味着循环是不可能的.相反,您可以使用递归实现相同的功能.同样,由于你没有,一般来说,有副作用,函数调用只有在返回数据时才有意义.所以吧(东西)可能不是很有用.它无法影响应用程序的其余部分.在函数式编程风格中,每次都应该在不同的数据上调用bar()函数,并返回应用程序其余部分可以执行的操作.

(ML在某些情况下确实允许副作用,但为了简单起见,我们暂时忽略它)

你到底想要达到什么目的?(你需要循环什么,这些功能有什么作用?

如果您提供更多细节,我们可以更具体地解释您应该如何编写程序.但事实上,你的程序在功能风格上根本没有意义.