以下方法确定从列表的开头开始最多可加多少个数字,而最多不加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与local交换,但是我仍然遇到语法错误(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
可能是一个复杂的表达式。您可以将表达式的各个部分提升为定义,然后使用对这些定义的引用来重写复杂表达式。通过折叠一些子表达式,可以帮助编写较短的表达式。当需要递归时(递归需要一个定义名称),也需要此构造。
另一种理解方式,是作为匿名函数的应用,其参数绑定就是这些定义。
Ex。
let
val x = 1
val y = 2
in
x + y
end
与写作相同
(fn (x, y) => x + y) (1, 2)
与写作相同
1 + 2
您错误地将定义放在整个求和结果的表达式的位置。
((请注意,由于语法问题,我没有检查函数的逻辑)
这是Coursera上Dan Grossman的编程语言中的一个家庭作业问题。这不公平...