2009-04-12 5 views
9

Je commence juste avec SML, et j'essaye de modifier le code pour que je comprenne ce qu'il fait (je ne peux pas trouver un débogueur SML/NJ décent, mais c'est une question séparée).Comment imprimez-vous dans une instruction de cas dans SML?

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

On suppose ce code est valide dans cette constant_int fait partie d'un type de données déjà déclaré, etc. Comment puis-je ajouter une déclaration d'impression de dire « retour « entier » » au cas? J'ai essayé:

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

Mais je reçois:

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

Je pense que je ne suis pas comprendre comment exécuter une séquence d'instructions, seule la dernière qui devrait être considéré comme la valeur de retour. Aucun conseil?

De même, comment est-ce que j'imprimerais ma propre valeur de type de données? SML n'a pas aimé quand j'ai essayé de passer une valeur de type de données dans print(), donc je dois probablement créer une nouvelle fonction d'impression pour chaque type de données, est-ce correct?

Répondre

20

Vous pouvez "exécuter une séquence d'instructions, seule la dernière doit être traitée comme la valeur de retour" en utilisant des points-virgules.

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

Dans ce cas, nous avions besoin d'envelopper la séquence des états entre parenthèses, car le point-virgule a priorité inférieure à la expression_cas, et donc si nous ne possédions pas les parenthèses, il pourrait penser que la l'expression de casse s'est terminée au point-virgule, et que toute l'expression case-est une partie de la séquence, ce qui n'est pas ce que vous voulez dans ce cas.

+0

Ne voulez-vous pas dire plus haut précendence? – Shuzheng

+2

@nlykkei: Non, je veux dire priorité inférieure. L'expression de cas est groupée en premier car elle a une priorité plus élevée, laissant le point-virgule, qui a la priorité la plus basse, étant la structure la plus externe. – newacct

Questions connexes