【问题标题】:SML: syntax error: replacing LET with RAISESML:语法错误:将 LET 替换为 RAISE
【发布时间】:2021-11-06 03:54:55
【问题描述】:

我正在编写一个函数,它以 (d, m, y) 格式获取日期。我需要计算 rez 值,所有这些 +getNthInt 函数调用都是从列表中添加某些元素。

fun firstNewMoonInt ((d, m, y) : int * int * int) : int option =
  let
    if m = 1 orelse m = 2 then y - 1
    else y
    val rez = newStyleCorrection (d, m, y) * 100000 
    + getNthInt(thousandCorrection, y div 1000) 
    + getNthInt (hundredCorrection, y div 100 mod 10)
    + getNthInt (decadeCorrection, y mod 100 div 10)
    + getNthInt (yearCorrection, y mod 1000)
    + getNthInt (monthCorrection, m - 1)
    + getNthInt (calendarCorrection, y mod 4)
    rez - lastSmaller(rez - 100000, reductions)
  in
    if rez div 100000 <= 30 then SOME rez
    else NONE
  end

我收到两个语法错误:

2.3-2.6 Error: syntax error: replacing  LET with  RAISE
13.3 Error: syntax error: inserting  LET

因为我使用了所有的关键字来构建结构:let-in-end、if-then-else。我不明白,我的代码有什么问题?

【问题讨论】:

  • 您好,只是小费。我建议为了调试这个,你最小化问题。即尝试删除东西,直到它起作用或足够小。现在函数相当复杂,很难发现问题。
  • 您希望表达式if m = 1 orelse m = 2 then y - 1 else yrez - lastSmaller(rez - 100000, reductions) 在变量绑定中完成什么?您可能应该查看 let 块的用途以及它可以包含的内容。
  • @molbdnilo 基本上 if 语句意味着如果月份值等于 1 或 2,那么我需要从年份值中减去 1,否则年份值保持不变。只有在检查后,我才能开始计算 rez 变量。在我执行了一堆 + 操作之后,我需要获取当前的 rez 值并从中减去我使用函数 lastSmaller 获得的另一个值
  • 忘记分配存在。事实上,别忘了还有其他你用过的编程语言——SML 与 Python 等语言有着根本的不同,而且在没有偏见的情况下更容易学习。

标签: sml


【解决方案1】:

let 内,应该有一系列声明。 (声明类似于val x = ...fun f x = ...)。但是在您的代码中,有一个 if 开始一个表达式。

您可以通过创建一个新变量来解决此问题,该变量是 if 表达式的结果:

let
  val new_y = 
    if m = 1 orelse m = 2 then y - 1
    else y

  val rez = ...

然后您将需要找出在其余代码中使用new_y 的位置。

请注意,在后面几行也有类似的问题:

rez - lastSmaller(rez - 100000, reductions)

这是一个应该有另一个声明的表达式。你也可以用同样的方法修复它:val new_rez = rez - lastSmaller (...),然后在下面适当的地方使用new_rez

【讨论】:

    猜你喜欢
    • 2015-06-01
    • 2017-05-09
    • 2013-01-31
    • 2017-11-20
    • 2011-12-23
    • 2011-05-12
    • 2012-05-24
    • 2013-01-10
    • 1970-01-01
    相关资源
    最近更新 更多