SML: syntax error: replacing LET with RAISE

SML: syntax error: replacing LET with RAISE

我正在编写一个函数,它采用 (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。我不明白,我的代码有什么问题?

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