【问题标题】:What's "node" doing in this snippet of SML?这个 SML 片段中的“节点”在做什么?
【发布时间】:2014-06-27 00:18:43
【问题描述】:

我正在开发一个项目,其中包含很多如下所示的代码:

structure MyStruct = struct
datatype node
  = A of Foo.t
  | B

type t = node Wrap.t

fun layout myNode =
  case node myNode of
    A foo => Foo.bar foo 
  | B => "void"
end

Wrap 在别处定义,但重点是它有一个参数化类型,t

nodecase node myNode of 行中做什么?它不是类型构造函数,因为 t 不是类型,因此将其更改为 case (node myNode) 会引发错误消息。此外,如果我编写如下所示的函数:

fun layout node myNode = ...

我收到一个类型错误,因为它的类型不是 MyStruct.t -> Layout.t,而是 'a -> MyStruct.node -> Layout.t。但是,如果我在 case 语句中做同样的事情,那就没问题了。

这是怎么回事?

【问题讨论】:

    标签: types compiler-errors sml signature smlnj


    【解决方案1】:

    程序中一定定义了一些名为node的函数,其类型为u -> node,对于一些u。该功能在这里应用。由此,layout 函数被简单地推断为具有u -> string 类型。

    【讨论】:

    • 是的,你是对的。事实证明,这个项目的组织方式使得这些结构中的每一个都有一个datatype node,然后由于我没有包含open 声明而被类型为'a Wrap.t -> 'a 的函数node 遮蔽。谢谢。
    • @PatrickCollins,实际上没有阴影,因为类型和值标识符存在于不同的命名空间中(模块​​和签名也是如此)。例如,在 ML 中写 s.th like fun f (time : time) = ... 就可以了。
    • 啊,好吧,我想这更有意义。我对这种模式感到非常困惑——我想它对于掌握这种语言的人来说不太透明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 1970-01-01
    • 2015-11-01
    • 2016-09-19
    相关资源
    最近更新 更多