2016-04-22 37 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的語法和語義,我們不能真正在這裏寫一個教程。