let-in表达式中的错误代码

时间:2013-01-30 16:03:02

标签: sml

我有这个SML代码。我不知道为什么我不能编译这个:

fun score = 
    let
       val sum = 3; (* error at this line : SYNTAX ERROR : inserting LPAREN *)
       if sum div 2 > 0
       then sum = 0
       else sum = 1
       (*some other code*)
    in
       sum (* I want to return sum after some steps of calculation *)
    end

2 个答案:

答案 0 :(得分:5)

您的代码存在的问题比jacobm指出的要多。
你也错过了一个函数参数。 SML中的函数总是带一个参数。例如

fun score () = 
    let val sum = 3
        val sum = if sum div 2 > 0
                  then sum = 0
                  else sum = 1
    in
       sum
    end

然而,这仍然没有多大意义。因为表达式sum = 0sum = 1计算为布尔值。

let-expression用于创建一些仅在in ... end部分内可见的局部声明。因此,你不应该用和计算的计算应该在in ... end部分内完成,除非你不想把它表达为函数的一种方法。

一个这样的例子是

fun score () = 
    let val sum = 3
    in
      if sum div 2 > 0
      then ...
      else ...
    end

如果我们看一下let-expression的语法,它可能更有意义

let
  <declaration>
in
  <expr> ; ... ; <expr>
end

因为if-then-else是一个表达式,所以它本身不能出现在“声明部分”中。

答案 1 :(得分:2)

该语法不合法 - 在letin之间,您可以获得的是一系列val name = expr个片段。但是你可以这样做:

fun score = 
    let val sum = 3
        val sum = if sum div 2 > 0
                  then sum = 0
                  else sum = 1
    in
       sum
    end

对于两个变量名称使用sum,我认为这有点奇怪,但它是合法的。