2009-04-12 9 views
9

私はSMLで出始めている、と私はので、私は(私はまともなSML/NJデバッガを見つけることができませんが、それは別の問題だ)、それはやっているか理解し、いくつかのコードを変更しようとしています。SMLのcase文の中でどのように印刷しますか?

fun type_check e theta env non_gens = 
    case e of 
    constant_int _ => (integer,theta) 
    | 
    constant_bool _ => (boolean,theta) 
    | ... 

これはそのconstant_intで有効なコードであると仮定し、私はケースに「『整数』を返す」と言ってprint文を追加するにはどうすればよいなど、すでに宣言したデータ型の一部ですか?私が試した:

... 
constant_int _ => (print "returning integer") (integer,theta) 
... 

しかし、私は得る:

 
    stdIn:167.22-167.65 Error: operator is not a function [tycon mismatch] 
     operator: unit 
     in expression: 
     (print "returning integer") (integer,theta) 

私はちょうど戻り値として扱われるべきであるだけで、最後のその一連の文を実行する方法を理解していないと思います。何かアドバイス?

また、私自身のデータ型の値をどのように出力するのですか? SMLはprint()にデータ型の値を渡そうとしたときに気に入らなかったので、おそらくそれぞれのデータ型に対して新しい印刷関数を作成する必要がありました。

答えて

20

セミコロンを使用すると、「一連のステートメントを実行し、最後のステートメントのみを戻り値として処理する」ことができます。この場合

... 
constant_int _ => (print "returning integer"; (integer,theta)) 
... 

セミコロンは大文字と表現よりも低い優先順位を持っており、我々は括弧を持っていなかったので、もし、それがと思うだろうので、私たちは、括弧内に一連の文をラップするために必要なcase-expressionはセミコロンで終了し、case-expression全体がシーケンスの一部であり、この場合はあなたが望むものではありません。

+0

より高い優先度を意味していませんか? – Shuzheng

+2

@nlykkei:いいえ、優先度は低いです。それは最も外側の構造であり、低い優先順位を有するセミコロンを残し、高い優先順位を有するので、case式は、最初にグループ化されます。 – newacct

関連する問題