什么"节点"在这个SML片段中做什么?

时间:2014-06-27 00:18:44

标签: types compiler-errors sml signature smlnj

我正在开发一个包含大量代码的项目:

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

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

fun layout node myNode = ...

我收到类型错误,因为它没有MyStruct.t -> Layout.t类型,而是'a -> MyStruct.node -> Layout.t。但是,如果我在案例陈述中做同样的事情,那就没关系。

这里发生了什么?

1 个答案:

答案 0 :(得分:1)

对于某些node,必须在程序中定义一些名为u -> node的函数,其类型为u。这个功能在这里应用。从那时起,layout函数就会被推断为类型为u -> string