如何在SML中的case语句中打印?

Kai*_*Kai 11 sml smlnj

我刚刚开始使用SML,我正在尝试修改一些代码,以便我理解它正在做什么(我找不到一个像样的SML/NJ调试器,但这是一个单独的问题).

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

假设这是有效的代码,因为constant_int是已经声明的数据类型的一部分,等等.如何添加一个print语句来说"返回"整数"'到案例中?我试过了:

...
constant_int _ => (print "returning integer") (integer,theta)
...
Run Code Online (Sandbox Code Playgroud)

但我得到:

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

我想我只是不理解如何执行一系列语句,只有最后一个语句应该被视为返回值.有什么建议?

另外,我如何打印自己的数据类型值?当我尝试将数据类型值传递给print()时,SML不喜欢所以我可能必须为每种数据类型创建一个新的打印函数,这是正确的吗?

new*_*cct 21

您可以使用分号"执行一系列语句,只应将最后一个语句视为返回值".

...
constant_int _ => ( print "returning integer"; (integer,theta) )
...
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们需要将括号中的语句序列包装起来,因为分号的优先级低于case-expression,因此如果我们没有括号,它会认为case-expression以分号结束,并且整个case-expression是序列的一部分,在这种情况下不是你想要的.

  • @nlykkei:不,我的意思是较低的优先权.首先对case表达式进行分组,因为它具有更高的优先级,而优先级较低的分号是最外层的结构. (2认同)