我正在开发一个包含大量代码的项目:
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
。但是,如果我在案例陈述中做同样的事情,那就没关系。
这里发生了什么?
答案 0 :(得分:1)
对于某些node
,必须在程序中定义一些名为u -> node
的函数,其类型为u
。这个功能在这里应用。从那时起,layout
函数就会被推断为类型为u -> string
。