2013-10-12 38 views
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返回类型。如何在不追加早期结果的情况下调用函数?

+0

使用带聚合器的内部函数? – Ashalynd

+0

我试过了。您仍然将f应用于每个数字,并且您仍然追加到较早的结果,从而给出单位列表类型。或者,你的意思是别的吗? – Krishna

+0

我的意思是这样的:(我不是sml中的pro,但它在所有func langs中的工作方式相同):'fun forinner(from,to,f,acc)= 如果from =然后acc else forinner (from + 1,to,f,f(from):: acc)' – Ashalynd

回答

1

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

一般来说,当你想要做的两件事情,只有返回的第二件事情的结果,可以使用下面的语法:

(thing1;thing2) 

例如:

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

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

现在,我们来看看代码的两个分支。

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

then分支,我们简单地调用ftof已经返回(),所以我们不结果做任何更多:

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

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

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

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

for (4,3,f) 
+0

谢谢!朴素醇';呵呵... – Krishna

相关问题