2016-04-22 2 views
0

この言語の構文は混乱します。print文がエラーを起こしていますか?

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 

ワット?

私はこれを理解できません。

答えて

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のような標準的な書籍のいくつかがセミコロンを浪費する傾向にある可能性があります。セミコロンはデリミタではなく、主にターミネータであるという印象を得るのは簡単です。 –

+0

if/elseブランチの最後のステートメントとしてprintステートメントを使用し、そのブランチからreturn()を使用する方法はありますか?この言語はコルセットのように感じます... –

+0

@lotolmencre '真ならば、print(" foo ")else()'。 'print'ステートメントはすでにユニット関数です。あなたはいつも 'fun printIfTrue(test、val)= if test then print(val)else()'という別の関数でこれをラップすることができます。 – eatonphil

関連する問題