2014-09-25 110 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