我有这段代码
fun decrement_to_zero r = if !r < 0
then r := 0
else while !r >= 0 do r := !r - 1
来自本教程
https://learnxinyminutes.com/docs/standard-ml/
但是我收到了这个错误:
stdIn:1.2-33.9 Error: operator and operand don't agree [literal]
operator domain: int ref
operand: int
in expression:
decrement_to_zero 10
当我用
打电话时 - decrement_to_zero 10;
为什么?
答案 0 :(得分:3)
为什么?
如果您检查功能的类型签名,
- decrement_to_zero;
> val it = fn : int ref -> unit
您可以确认其输入类型与10 : int
不对齐。但是如果你创建一个int ref
,
- val foo = ref 10;
> val foo = ref 10 : int ref
并将其传递给您的函数,
- decrement_to_zero foo;
> val it = () : unit
你会看到引用已更新,但不是零,
- foo;
> val it = ref ~1 : int ref
所以函数的名字选择得很差,而且写得很好。自从我最初写这篇教程以来,这个教程似乎出了很多问题。
尽管标准ML支持引用,但编写纯函数通常更为惯用。纯函数仅将值作为输入并将值作为输出返回,但不会影响函数外部的世界(例如,在任何给定时间点,引用foo
指向的内容)。例如,
fun actually_decrement_to_zero n =
if n > 0 then actually_decrement_to_zero (n-1) else n
使用它,
- actually_decrement_to_zero 10;
> val it = 0 : int
正如您所看到的,结果来自函数,而不是间接通过引用。