2009-04-12 3 views
9

Я только начинаю с SML, и я пытаюсь изменить код, чтобы понять, что он делает (я не могу найти достойный отладчик SML/NJ, но это отдельный вопрос).Как вы печатаете внутри оператора case в SML?

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

Предположим, что это правильный код в этом constant_int является частью типа данных уже объявлен, и т.д. Как добавить заявление для печати, чтобы сказать: «Возвращение„целое“» к делу? Я пробовал:

... 
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

Смежные вопросы