首页 > 解决方案 > SML/NJ 中的模式匹配空 Fifo.fifo

问题描述

当我尝试写类似的东西时

fun test Fifo.empty = true
  | test _ = false`

我收到一条错误消息,上面写着Error: variable found where constructor is required: Fifo.empty. 我对 SML/NJ 真的很陌生。原来它与Fifo.empty成为一个longId有关,但我还没有想出如何解决这个问题,除了通过传递Fifo.isEmpty作为参数来修补它,但这几乎不是一个解决方案......

标签: pattern-matchingsmlfifosmlnj

解决方案


当您检查 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是一个'a fifo值。看看它是如何制作的,

- Fifo.empty;
val it = Q {front=[],rear=[]} : 'a fifo

不幸的是, 'a fifoQ的数据类型构造函数被不透明的模块隐藏(因此定义显示为“ ”。当您定义数据类型时,它的构造函数(例如)成为值构造函数模式构造函数,但是当您声明值时使用这样的值构造函数,它们也不会成为模式构造函数。datatype...QFifo.empty

我还没有想出如何解决这个问题,除了通过Fifo.isEmpty作为参数传递来修补它,但这几乎不是一个解决方案......

我不确定您为什么需要Fifo.isEmpty作为参数传入;你不能只Fifo.isEmpty在函数体中引用吗?也许你没有解释这个问题的维度。

以下情况如何:

fun test queue = Fifo.isEmpty queue

或者简单地说:

val test = Fifo.isEmpty

一般来说,如果你想传入一堆库函数作为参数,你可以考虑构建一个高阶模块(函子),它将另一个模块作为参数。


推荐阅读