2016-04-22 80 views
0

這種語言的語法很混亂。打印語句導致錯誤?

fun bar a = 
    print (Int.toString a); 
    0 

編譯。不知道爲什麼emacs縮進0。

fun bar a = 
    print (Int.toString a) 
    0 

引發錯誤。

Error: operator is not a function [tycon mismatch] 
    operator: unit 
    in expression: 
    (print (Int.toString a)) 0 


fun foo a = 
    if a < 0 
    then 
     0 
    else 
     0 

編譯。

fun foo a = 
    if a < 0 
    then 
     print (Int.toString a); 
     0 
    else 
     0 

將引發錯誤。

syntax error: replacing SEMICOLON with EQUALOP 

Wat?

我對此沒有任何意義。

回答

3

看來你很難理解SML中可以使用分號的地方。有兩個主要地方允許他們:

  1. 加入括號內的組:(a; b)。那意味着a; b無效。你需要把它包裝在括號內。

  2. inend之間的let塊。但是,你不要在這裏括號:

let 
    val foo = ... 
in 
    a; 
    b; 
    c 
end 

所以,你的最後一個例子應該是:

fun foo a = 
    if a < 0 
    then (print (Int.toString a); 0) 
    else 0 

它們也可用於內部分隔頂級表達式或聲明一個文件或在REPL上,但它們是可選的。這就是爲什麼你的第一個例子編譯。

+0

混淆的一部分可能會追溯到某些標準書籍(如Ullman's傾向於濫用分號)的方式。很容易得到這樣的印象:分號主要是終止符而不是分隔符。 –

+0

有沒有辦法使用print語句作爲if/else分支中的最後一個語句,而不是從那個分支返回()?這種語言感覺像一個緊身胸衣... –

+0

@lotolmencre'如果是真的,然後打印(「foo」)else()'。 'print'語句已經是一個單元函數。你總是可以用另一個函數包裝這個'fun printIfTrue(test,val)= if test然後print(val)else()'。 – eatonphil