运算符操作数类型不匹配

时间:2016-04-21 00:07:29

标签: types operators sml operands

我有这段代码

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;

为什么?

1 个答案:

答案 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

正如您所看到的,结果来自函数,而不是间接通过引用。