【问题标题】:Why can't I access my structure's internal ORD_SET structure?为什么我不能访问我的结构的内部 ORD_SET 结构?
【发布时间】:2013-04-22 13:58:48
【问题描述】:

我编写的这个练习旨在帮助我理解标准 ML 中的签名、结构和函子。我似乎无法让它工作。仅供参考,我正在使用

Standard ML of New Jersey v110.75 [built: Sun Jan 20 21:55:21 2013]

对于“可以计算大小的对象”,我有以下 ML 签名:

signature MAG_OBJ =
sig
   type object
   val mag : object -> int
end

如果我想给出一个“具有大小的 int 集”的结构,我可能有一个有序 int 的结构,用于标准库的 ORD_SET 签名,如下所示:

structure OrderedInt : ORD_KEY =
struct
   type ord_key = int
   val compare = Int.compare
end

然后我可以创建一个仿函数来给我一个具有所需类型和属性的结构:

functor MakeMagSet(structure ELT : ORD_KEY) : MAG_OBJ =
struct
   structure Set : ORD_SET = RedBlackSetFn(ELT)
   type object = Set.set
   val mag = Set.numItems
end

到目前为止一切顺利(至少一切都编译好了)。现在我为上面创建的 OrderedInt 结构创建一个结构实例:

structure IntMagSet = MakeMagSet(structure ELT = OrderedInt)

但是当我尝试使用它(创建一个集合并计算它的大小)时,我得到一个错误:

val X = IntMagSet.Set.addList(IntMagSet.Set.empty, [0,1,2,3,4,5,6,7,8,9])

给出错误:

Error: unbound structure: Set in path IntMagSet.Set.empty.addList

据我了解,使用 :> 不透明地赋予签名使其无法访问签名中未明确定义的任何结构内部,但我透明地赋予了 MAG_OBJ,因此我应该能够访问 Set结构,对吧?我在这里错过了什么?

[编辑]

即使重写函子以专门将我想要的函数绑定到结构也不好:

functor MakeMagSet(structure ELT: ORD_KEY) : MAG_OBJ =
struct
   structure Set : ORD_SET = RedBlackSetFn(ELT)
   type object = Set.set
   val mag = Set.numItems
   val empty = Set.empty
   val addList = Set.addList
end

尝试访问“empty”和“addList”会出现未绑定变量错误。

另一方面,尝试在结构之外显式定义 Set 结构并使用其函数会在调用 mag 时出现类型错误:

Error: operator and operand don't agree [tycon mismatch]
  operator domain: IntMagSet.object
  operand:         Set.set
  in expression:
    IntMagSet.mag X

【问题讨论】:

  • 刚刚意识到我不能说“IntMagSet.Set.empty.addList”,因为我很傻而且太习惯于面向对象的风格。我认为这里仍然存在问题,但我必须编辑问题。

标签: scope structure sml smlnj


【解决方案1】:

我认为是因为您明确表示MakeMagSet 的类型生成了MAG_OBJ,其签名不包含Set。如果您摆脱了: MAG_OBJ 或使MAG_OBJ 包含ORD_SET,那么它将起作用。

【讨论】:

  • 让每个 MAG_OBJ 都包含一个 ORD_SET 是没有意义的,因为如果我想对非集合的事物“计算量级”怎么办?
  • 似乎放置 : MAG_OBJ 并没有简单地验证结果结构是否符合接口,而是限制它这样做。删除:MAG_OBJ 确实解决了这个问题。现在,如果我在其中使用它,例如另一个仿函数,我仍然可以输入:MAG_OBJ 并让它使用 mag 函数,但是我不能再引用底层集合了。这让我想知道为什么函子中的类型归属甚至是一个特征;它使我的结构完全无用!
猜你喜欢
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
  • 2016-01-02
  • 1970-01-01
相关资源
最近更新 更多