首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SML/NJ中的模式匹配空Fifo.fifo

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

Stack Overflow用户
提问于 2018-04-25 04:27:47
回答 1查看 476关注 0票数 1

当我试图写这样的东西

代码语言:javascript
复制
fun test Fifo.empty = true
  | test _ = false`

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-25 05:30:32

当你检查Fifo模块时,

代码语言:javascript
复制
- 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值。

代码语言:javascript
复制
- Fifo.empty;
val it = Q {front=[],rear=[]} : 'a fifo

不幸的是,‘fifo’的Q数据类型构造函数隐藏在不透明模块中(因此datatype定义为"...“)。当定义数据类型时,它的构造函数(例如Q)同时成为值构造函数和模式构造函数,但是当使用这种值构造函数声明像Fifo.empty这样的值时,它们也不会成为模式构造函数。

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

我不知道为什么需要将Fifo.isEmpty作为参数传递;难道不能在函数体中引用Fifo.isEmpty吗?也许这个问题有你没有解释的维度。

以下几点如何?

代码语言:javascript
复制
fun test queue = Fifo.isEmpty queue

或者简单地说:

代码语言:javascript
复制
val test = Fifo.isEmpty

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50014077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档