2012-02-22 49 views
2

我是一個完整的新手,對於內部函數的語法有困難。我需要做的是獲取一個int列表的列表,平均每個列表,並返回一個reals列表。這是迄今爲止的僞代碼。SML的內部函數NJ

fun listAvg [] = 0 
    else (sum (x) div size (x)) 

     fun sum[] = 0 
     | sum(head::rest)= head + sum rest; 


     fun size [] = 0 
     | size(head::rest) = 1 + size rest; 

    listAvg([[1,3,6,8,9], [4,2,6,5,1], [9,5,9,7], [5,4], [3,6,4,8]]); 

任何意見將不勝感激。謝謝!

回答

5

使用let,如

fun listAvg [] = 0 
    | listAvg x = 
    let 
     fun sum[] = 0 
      | sum(head::tail)= head + sum tail; 
     fun size [] = 0 
      | size(head::tail) = 1 + size tail; 
    in 
     (sum x) div (size x) 
    end 

你有一個int list傳遞給這個函數例如

listAvg [1, 2, 3, 4]; 

這是你的代碼沒有什麼變化,除了重新排列順序,並把該關鍵字letinend。如果這不是作業,我建議在List結構中使用一些內置的標準庫函數,這可以將此函數減少爲兩行,包括空列表上的模式匹配。

編輯

有兩種可能的含義爲「平均INTS的名單列表。」首先是平均每個列表,然後取平均值,其次是將列表一起加入一個長列表中,並將整個列表的平均值加入整個列表。當所有int列表具有相同長度時,這兩種方法是等價的(除了舍入錯誤),但正如您的示例所示,它們不必是相同的長度。

由於這是家庭作業,我不會直接給你答案,但是考慮到後面,這可能會有幫助:如果您使用「平均一個列表的第一個解釋

  • 的整數列表:「有一個內置的SML函數,可以讓您將另一個函數應用於列表中的每個元素,並獲取結果列表。這對獲取個人平均數可能會有所幫助,然後您可以將它們組合成一個總體平均數。
  • 如果您使用第二種解釋:有一個內置的SML函數(它看起來像一個運算符,但許多看起來像SML中的運算符的東西只是中綴函數)將兩個列表連接在一起,並且內置的SML函數將函數應用於列表中的元素以及累加器值,以生成單個值。您可能可以使用這兩個函數來創建一個所有數字的長列表,然後您可以對其進行平均。
+0

問題是我需要平均列表的整數列表,即listAvg([[1,3,6,8,9],[4,2,6,5,1],[9 ,5,9,7],[5,4],[3,6,4,8]]);但這有很大幫助。謝謝! – MCR 2012-02-22 03:50:30