Sml before在ML中的用法

Sml before在ML中的用法,sml,ml,Sml,Ml,前面的ML描述如下: a在b之前 返回a。它提供了一个符号化的简写,用于计算a,然后是b,然后再计算 返回a的值 当我尝试使用该命令时,预期会计算x=4和(4+1) val x = (3+1 before 4+1) 我收到了错误消息: Standard ML of New Jersey v110.78 [built: Sun Apr 26 01:06:11 2015] - stdIn:1.11-1.25 Error: operator and operand don't agree [over

前面的ML描述如下:

a在b之前 返回a。它提供了一个符号化的简写,用于计算a,然后是b,然后再计算 返回a的值

当我尝试使用该命令时,预期会计算x=4和(4+1)

val x = (3+1 before 4+1)
我收到了错误消息:

Standard ML of New Jersey v110.78 [built: Sun Apr 26 01:06:11 2015]
- stdIn:1.11-1.25 Error: operator and operand don't agree [overload conflict]
  operator domain: [+ ty] * unit
  operand:         [+ ty] * [+ ty]
  in expression:
    (3 + 1 before 4 + 1)
- 
可能有什么问题

编辑 根据马特的回答,我应该用

val x = (3+1 before print "<end>")
从中,它表示
before
的类型是
before:('a*unit)->'a
,并且正如您的类型错误所指定的,它期望第二个参数的类型是
unit
,但是,您提供了
int
类型的内容。尝试执行
valx=(3+1 before())
,您应该会得到预期的结果。其目的是使第二个参数成为某种影响计算的副作用,例如操作
ref
单元格或执行一些IO,这些都是您在计算第一个参数之前要运行的。以下几点似乎是相同的:

val x = e1 before e2


这就是说,之前的
不是我真正使用的东西,所以如果其他人有什么要补充的,当然欢迎评论。

“和(4+1)被评估”你认为
4+1
的评估会产生什么影响?您是希望打印结果,还是只希望计算结果并将其丢弃?我曾在希望在递增计数器之前获取计数器的旧值的情况下使用过它!a在a之前:=!a+1。Poly/ML编译器中有许多这样的代码。
val x = e1 before e2
val x = let val a = e1
            val _ = e2
        in a end