2013-10-12 60 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

相關問題