以下方法确定从列表开头开始可以添加多少个数字而不添加最多4个:
number_before_Reaching_sum(4,[1,2,3,4,6]);
应该返回: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
语法错误:插入LOCAL
在EOF中找到语法错误
我似乎无法在此代码中找到错误。我有一些Python的经验,但刚开始学习sml。我爱它,但我不理解所有的错误信息。我真的花了好几个小时,但我想我不太了解解决我的问题。我尝试与本地交换let,但我仍然有语法错误(equalop)。我认为in和end之间的函数是表达式而不是声明。但我要感谢对此的任何评论。如果你想出了替代代码,那么如果你不使用更高级的功能就可以做到这一点很棒,因为我只是想把基础知识搞定:-)
答案 0 :(得分: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 … end
,let
和in
之间的部分用于本地定义; in
和end
之间的部分用于表达式,它将是let … in … end
表达式的评估(此构造确实是一个表达式)。
将let … in … end
视为可能复杂的表达式。您将表达式的一部分作为定义提升,然后使用对这些定义的引用重写复杂表达式。这有助于通过折叠一些子表达式来编写更短的表达式。当需要递归时,此构造也是必需的(递归需要定义名称)。
理解它的另一种方法是作为匿名函数的应用,其参数绑定是这些定义。
实施例
let
val x = 1
val y = 2
in
x + y
end
与写作相同
(fn (x, y) => x + y) (1, 2)
与写作
相同1 + 2
您错误地将定义放在整体评估的表达式的位置。
(注意我没有检查函数的逻辑,因为问题是关于语法)