模式匹配SML / NJ中的空Fifo.fifo

时间:2018-04-25 04:27:48

标签: pattern-matching sml fifo smlnj

当我尝试写类似

的东西时
fun test Fifo.empty = true
  | test _ = false`

我收到一条显示Error: variable found where constructor is required: Fifo.empty的错误消息。我是SML / NJ的新手。事实证明它与Fifo.empty是一个longId有关,但我还没有弄明白如何解决这个问题,除非通过传递Fifo.isEmpty作为参数来修补它,但是&# 39;几乎不是解决方案......

1 个答案:

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

通常,如果您想将一堆库函数作为参数传递,您可以考虑构建一个以另一个模块作为参数的高阶模块(仿函数)。