0

我正在寻找一个功能for : int * int * (int -> unit) -> unit。我需要这个来打印一个数字列表。更具体地说,我有一个函数f num = print ((Int.toString num)^"\n")。到目前为止,我有这个:

fun for(from,to,f)=
        if from=to then [f(to)]
        else f(from)::for(from+1,to,f)

这给了我一个返回类型unit list。如何在不附加到早期结果的情况下调用函数?

4

1 回答 1

1

()您要返回的是从()最后一次调用到f- 即来自then分支的调用。

一般来说,当你想做两件事,并且只返回第二件事的结果时,你使用下面的语法:

(thing1;thing2)

例如:

(print "foo\n"; 2 + 3);

将打印出字符串“foo\n”,然后返回5.

所以现在,让我们看看你的代码的两个分支。

fun for (from,to,f) = if from = to 
                      then ...
                      else ...

在分支中then,我们只需调用f. 已经返回,所以我们不再对结果做任何事情:tof()

fun for (from,to,f) = if from = to 
                      then f to
                      else ...

else 分支稍微复杂一些。我们想调用 f on from,然后进行递归调用。递归调用的返回类型是unit,所以这就是我们想要返回的:

fun for (from,to,f) = if from = to 
                      then f to 
                      else (f from;for (from+1,to,f));

另一件事:如果你这样做会发生什么?

for (4,3,f)
于 2013-10-12T22:49:48.927 回答