types - 运算符操作数类型不匹配

标签 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;

为什么?

最佳答案

Why?

如果您检查函数的类型签名,

- 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

如您所见,结果直接来自函数,而不是通过引用间接得出。

关于types - 运算符操作数类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36757360/

相关文章:

javascript - JavaScript 数组初始化之前的 "var"指的是什么,是列表的元素还是数组本身?

list - SML - 多项式的系数相乘

functional-programming - 有哪些高质量的标准 ML 代码/项目可供学习?

c - 在 C 变量定义中输入括号

exception - 是否可以通过向 Haskell 添加一个新功能(我称之为 "subtype system")来发现用 Haskell 编写的程序中的大部分错误?

c++ - 检查一个Cstring是否只包含汉字

python - 按字符串名称以编程方式查找运算符

.net - 在 F#/.NET 中实现标准 ML 签名

c# - 在同一方法签名中的函数的 TIn 的扩展方法中使用此类型参数的类型

swift - 在 Swift 中不大于运算符!>