sml中的语法错误:插入LOCAL

时间:2014-09-25 18:35:20

标签: syntax-error sml

以下方法确定从列表开头开始可以添加多少个数字而不添加最多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之间的函数是表达式而不是声明。但我要感谢对此的任何评论。如果你想出了替代代码,那么如果你不使用更高级的功能就可以做到这一点很棒,因为我只是想把基础知识搞定:-)

1 个答案:

答案 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 … endletin之间的部分用于本地定义; inend之间的部分用于表达式,它将是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

您错误地将定义放在整体评估的表达式的位置。

(注意我没有检查函数的逻辑,因为问题是关于语法)