2014-09-25 117 views
1

以下方法確定多少個號碼可以被添加了從列表的開頭開始不增加高達4:語法錯誤:插入LOCAL

number_before_Reaching_sum (4, [1,2,3,4,6]);
should return : val it = 2 : int

fun number_before_reaching_sum (sum : int * int list) = 
    let val len_orig_list = length (#2 sum) 
    in fun num_bef_reach_sum (sum) = 
      if #1 sum <= 0 
      then len_orig_list - (length (#2 sum)) - 1 
      else num_bef_reach_sum (#1 sum - hd (#2 sum), tl (#2 sum)) 
    end 

syntax error: inserting LOCAL
syntax error found at EOF

我可以」 t似乎發現這個代碼中的錯誤。我有一些Python的經驗,但剛開始學習sml。我很喜歡它,但我不明白所有的錯誤信息。我真的花了幾個小時,但我認爲我不知道解決我的問題。我嘗試與本地交換,但我仍然有語法錯誤(equalop)。我認爲in和end之間的函數是表達式而不是聲明。但我希望對此有任何意見。如果你拿出替代代碼,如果你這樣做是沒有使用更先進的功能,這將是巨大的,因爲我只是試圖讓基本下跌:-)

回答

1

你大概意思是:

fun number_before_reaching_sum (sum : int * int list) = 
    let 
     val len_orig_list = length (#2 sum) 
     fun num_bef_reach_sum (sum) = 
      if #1 sum <= 0 
      then len_orig_list - (length (#2 sum)) - 1 
      else num_bef_reach_sum (#1 sum - hd (#2 sum), tl (#2 sum)) 
    in 
     num_bef_reach_sum (sum) 
    end 

隨着let … in … endletin之間的部分是用於在本地定義; inend之間的部分用於表達let … in … end表達式的評估(該構造確實是表達式)。

思考的let … in … end作爲可能複雜的表達式。將部分表達式提升爲定義,然後使用對這些定義的引用重新編寫複雜表達式。這有助於通過摺疊一些子表達式來編寫較短的表達式。當需要遞歸時(遞歸需要定義名稱),此構造也是必需的。

另一種方式去理解它,是作爲一個匿名函數,其參數綁定這些定義的應用程序。

Ex。

let 
    val x = 1 
    val y = 2 
in 
    x + y 
end 

是一樣的書寫

(fn (x, y) => x + y) (1, 2) 

這是一樣的書寫

1 + 2 

你錯誤地把定義在整個計算表達式的地方。

(注意我沒有檢查函數的邏輯,因爲問題與語法有關)

+1

謝謝。這爲我清除了它。當然,函數必須首先定義(在let和in之間),然後只有在in和end之間調用函數時才能使用表達式。現在我可以繼續測試我的功能的邏輯(只要我回到我的電腦上):-)。感謝您抽出時間,Hibou57。 – Rohit88 2014-09-26 12:18:50