sml中的语法错误:插入LOCAL

问题描述 投票:1回答:1

以下方法确定从列表的开头开始最多可加多少个数字,而最多不加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之间的功能是表达式而不是声明。但是,对此我将不胜感激。如果您想出其他代码,那么不使用更高级的功能就可以了,因为我只是在尝试降低基础知识:-)

syntax-error sml
1个回答
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

您错误地将定义放在整个求和结果的表达式的位置。

((请注意,由于语法问题,我没有检查函数的逻辑)


0
投票

这是Coursera上Dan Grossman的编程语言中的一个家庭作业问题。这不公平...

© www.soinside.com 2019 - 2024. All rights reserved.