2016-04-22 41 views
0

为什么编译?变量在打印语句后被遗忘

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 

回答

2

我觉得你对语言的失望会阻止你解决你的问题而不是语言的局限性。正如我在之前的回答中所说的那样,分号不能像你用过的那样使用。你需要用括号内的这些语句:

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

此外,你第一个片段并不需要一个分号:

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

这里的东西,在SML分号不用于终止语句,它们'用于分离表达式。将;想象为二元运算符,就像+-一样。有了你需要使用括号的附加约束。

此外,您可能在内以错误的方式使用=运算符。这不是分配,这是一个平等检查,就像其他语言的==一样。如果你想分配,你需要一个ref类型。

最好问你到底想要解决什么问题,因为在这一点上,你完全误解了SML的语法和语义,我们不能真正在这里写一个教程。