How do you print inside a case statement in SML?

Kai picture Kai · Apr 12, 2009 · Viewed 14.2k times · Source

I'm just starting out with SML, and I'm trying to modify some code so I understand what it's doing (I can't find a decent SML/NJ debugger, but that's a separate question).

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

Assume this is valid code in that constant_int is part of a datatype already declared, etc. How do I add a print statement to say 'Returning "integer"' to the case? I tried:

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

But I get:

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

I think I'm just not understanding how to execute a sequence of statements, only the last of which should be treated as the return value. Any advice?

Also, how would I print my own datatype value? SML didn't like when I tried to pass a datatype value into print() so I probably have to create a new print function for each datatype, is that correct?

Answer

newacct picture newacct · Apr 13, 2009

You can "execute a sequence of statements, only the last of which should be treated as the return value" by using semicolons.

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

In this case, we needed to wrap the sequence of statements in parentheses, because the semicolon has lower precedence than the case-expression, and so if we didn't have the parentheses, it would think that the case-expression ended at the semicolon, and that the entire case-expression is a part of the sequence, which is not what you want in this case.