2009-04-12 4 views
9

Estoy comenzando con SML, y estoy tratando de modificar algunos códigos, así que entiendo lo que está haciendo (no puedo encontrar un depurador SML/NJ decente, pero esa es una pregunta aparte).¿Cómo se imprime dentro de una declaración de caso en SML?

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

supongo que es un código válido en ese constant_int es parte de un tipo de datos ya se declaró, etc. ¿Cómo agrego una sentencia print decir 'que vuelve 'número entero'' para el caso? Probé:

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

Pero consigo:

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

Creo que no estoy entendiendo cómo ejecutar una secuencia de instrucciones, sólo el último de los cuales debe ser entendido como el valor de retorno. ¿Algún consejo?

Además, ¿cómo imprimiría mi propio valor de tipo de datos? A SML no le gustó cuando intenté pasar un valor de tipo de datos a print(), así que probablemente tenga que crear una nueva función de impresión para cada tipo de datos, ¿es correcto?

Respuesta

20

Puede "ejecutar una secuencia de declaraciones, solo la última de las cuales debe tratarse como el valor de retorno" utilizando punto y coma.

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

En este caso, se necesita para envolver la secuencia de instrucciones que aparecen entre paréntesis, porque el punto y coma tiene menor prioridad que el caso-expresión, y por lo que si no tuviéramos los paréntesis, se podría pensar que la La expresión de caso finalizó en el punto y coma y toda la expresión de caso forma parte de la secuencia, que no es lo que desea en este caso.

+0

¿No te refieres a una mayor precendencia? – Shuzheng

+2

@nlykkei: No, me refiero a menor precedencia. La expresión de caso se agrupa primero porque tiene una mayor precedencia, dejando el punto y coma, que tiene una precedencia más baja, siendo la estructura más externa. – newacct

Cuestiones relacionadas