以下方法确定可以从列表的开头开始相加多少个数字而不加起来为 4:
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
我似乎无法在此代码中找到错误。我有一些使用 Python 的经验,但刚刚开始学习 sml。我很喜欢它,但我不明白所有的错误信息。我真的花了几个小时在这上面,但我认为我知道的不够多,无法解决我的问题。我尝试与本地交换 let,但仍然出现语法错误(equalop)。我认为 in 和 end 之间的函数是表达式而不是声明。但我将不胜感激对此的任何评论。如果您想出替代代码,如果您在不使用更高级功能的情况下这样做会很棒,因为我只是想了解基础知识:-)
最佳答案
你可能是这个意思:
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
作为一个可能复杂的表达式。您将表达式的一部分提升为定义,然后使用对这些定义的引用重写复杂的表达式。这有助于通过折叠一些子表达式来编写更短的表达式。当需要递归时也需要此构造(递归需要定义名称)。另一种理解它的方法是作为匿名函数的应用程序,其参数绑定(bind)是这些定义。
前任。
let
val x = 1
val y = 2
in
x + y
end
和写一样
(fn (x, y) => x + y) (1, 2)
这和写作一样
1 + 2
您错误地将定义放在整个计算结果的表达式的位置。
(注意我没有检查函数的逻辑,因为问题是关于语法的)
关于syntax-error - sml 中的语法错误 : Inserting LOCAL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26045700/