Как вы печатаете внутри оператора case в SML? - PullRequest
9 голосов
/ 13 апреля 2009

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

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 (), поэтому мне, вероятно, нужно создать новую функцию печати для каждого типа данных, это правильно?

1 Ответ

20 голосов
/ 13 апреля 2009

Вы можете «выполнить последовательность операторов, только последняя из которых должна рассматриваться как возвращаемое значение», используя точки с запятой.

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

В этом случае нам нужно было обернуть последовательность операторов в круглые скобки, поскольку точка с запятой имеет меньший приоритет, чем выражение case, и поэтому, если бы у нас не было скобок, было бы думать, что выражение case закончилось на точку с запятой, и что все выражение case является частью последовательности, что в данном случае не то, что вы хотите.

...