当我尝试写类似
的东西时fun test Fifo.empty = true
| test _ = false`
我收到一条显示Error: variable found where constructor is required: Fifo.empty
的错误消息。我是SML / NJ的新手。事实证明它与Fifo.empty
是一个longId有关,但我还没有弄明白如何解决这个问题,除非通过传递Fifo.isEmpty
作为参数来修补它,但是&# 39;几乎不是解决方案......
答案 0 :(得分:2)
检查Fifo模块时,
- open Fifo;
[autoloading]
[library $SMLNJ-LIB/Util/smlnj-lib.cm is stable]
[autoloading done]
opening Fifo
datatype 'a fifo = ...
exception Dequeue
val empty : 'a fifo
(* and so on *)
您可以看到Fifo.empty
是'fifo 值。要了解它是如何制作的,
- Fifo.empty;
val it = Q {front=[],rear=[]} : 'a fifo
不幸的是,'fifo 的Q
数据类型构造函数被opaque模块隐藏(因此datatype
定义显示为“{{1}当您定义数据类型时,其构造函数(例如...
)将成为值构造函数和模式构造函数,但是当您声明像{{1}这样的值时使用这样的值构造函数,它们也不会成为模式构造函数。
我还没弄清楚如何解决这个问题,除非通过传递
Q
作为参数进行修补,但这不是解决方案......
我不确定为什么你需要传递Fifo.empty
作为论据;你不能只在功能体中引用Fifo.isEmpty
吗?也许你没有解释这个问题的维度。
以下内容如何:
Fifo.isEmpty
或者简单地说:
Fifo.isEmpty
通常,如果您想将一堆库函数作为参数传递,您可以考虑构建一个以另一个模块作为参数的高阶模块(仿函数)。