Sml before在ML中的用法
前面的ML描述如下: a在b之前 返回a。它提供了一个符号化的简写,用于计算a,然后是b,然后再计算 返回a的值 当我尝试使用该命令时,预期会计算x=4和(4+1)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
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