12

私は SML を使い始めたばかりで、何をしているのかを理解するためにいくつかのコードを変更しようとしています (適切な SML/NJ デバッガーが見つかりませんが、それは別の質問です)。

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 エラー: 演算子は関数ではありません [タイコンの不一致]
      演算子: 単位
      式で:
        (print "returning integer") (integer,theta)

一連のステートメントを実行する方法を理解していないだけだと思います。最後のステートメントのみを戻り値として扱う必要があります。何かアドバイス?

また、自分のデータ型の値をどのように出力しますか? データ型の値を print() に渡そうとしたときに SML が気に入らなかったので、データ型ごとに新しい印刷関数を作成する必要があると思いますが、正しいですか?

4

1 に答える 1

23

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

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

この場合、一連のステートメントを括弧で囲む必要がありました。これは、セミコロンの優先順位が case-expression よりも低いためです。したがって、括弧がないと、case-expression がセミコロンで終了したと見なされます。 、そして case-expression 全体がシーケンスの一部であること、これはこの場合に必要なものではありません。

于 2009-04-12T22:08:04.430 に答える