print语句后变量被遗忘

时间:2016-04-22 18:45:42

标签: sml smlnj

为什么要编译?

fun foo (h::t) =
    h = hd(t);

但这不是

fun foo (h::t) =
    PolyML.print (h::t);
    print "\n";
    h = hd(t);

Value or constructor (h) has not been declared   Found near =( h, hd(t))

Value or constructor (t) has not been declared   Found near =( h, hd(t))
Exception- Fail "Static errors (pass2)" raised

1 个答案:

答案 0 :(得分:2)

我认为您对语言的挫败感使您无法解决问题而不是语言的限制。正如我在之前的回答中所说,分号不能像你使用的那样使用。您需要将这些语句包装在括号内:

fun foo (h::t) =
  (
    PolyML.print (h::t);
    print "\n";
    h = hd(t)
  )

此外,您的第一个代码段不需要分号:

fun foo (h::t) =
    h = hd(t)

在这里,SML分号不用于终止语句,它们用于分隔表达式。将;视为二元运算符,就像+-一样。附加约束,你需要括号。

此外,您可能在=内以错误的方式使用h = hd(t)运算符。它不是作业,它是一种平等检查,就像其他语言中的==一样。如果您想要分配,则需要ref类型。

最好问一下你究竟要尝试解决的问题,因为此时你完全误解了SML的语法和语义,我们无法真正写出来在这里的教程。