是否可以在标准 ML 中支持更高种类的类型?
Is it possible to support higher-kinded types in Standard ML?
我在 this post 中读到,ML 方言不允许非基础类型的类型变量。例如。最后一条语句不可表示:
-- Haskell code
type Ground = Int
type FirstOrder a = Maybe a
type SecondOrder c = c Int -- ML do not allow :c
OCaml 仅在模块级别支持更高种类。有一些解释 (here and author's comment here) 关于 OCaml 的哪些特性与更高级类型的机会冲突。
如果我没理解错的话,主要问题出在以下事实:
- OCaml 不遵循类型定义的 "freshness" 限制:构造
type
可以定义别名(类型将保持不变)和新的新类型
- 可以隐藏类型别名定义
AFAIK,标准 ML 具有不同的类型定义和别名结构:type
用于别名,datatype
用于新类型引入。
不幸的是,我不太了解 SML -- 是否可以导出隐藏定义的类型别名?如果有任何其他 SML 功能仍然不能很好地适应更高类型的机会,有人可以告诉我吗?
仿函数可能会出现一些问题 -- 能否请您提供一个代码示例?我听说过很多次这样的案例,但仍然没有找到完整的例子。
是的,SML 可以通过仿函数来表达高等类型的等价物,也可以将它们抽象化。无用的例子:
functor F (type 'a t) :> sig type 'a u end =
struct
type 'a u = ('a t) t
end
但是,与 OCaml 不同,SML(官方)没有高阶仿函数,因此根据标准,您只能用这种方式表达二阶类型构造函数。
FWIW,OCaml 可能对类型别名和生成类型使用相同的关键字(type
vs datatype
在 SML 中),但它们在句法上仍然通过右侧区分。所以这与 SML.In 两种语言没有真正的区别,签名中出现的抽象可以实现为类型别名或生成类型。所以 Leo 暗示的类型推断问题同样存在于两者中。 Haskell 可以在没有这个问题的情况下逃脱,因为它在类型抽象方面没有相同的表现力(即,模块没有 "sealing" 运算符)。
我在 this post 中读到,ML 方言不允许非基础类型的类型变量。例如。最后一条语句不可表示:
-- Haskell code
type Ground = Int
type FirstOrder a = Maybe a
type SecondOrder c = c Int -- ML do not allow :c
OCaml 仅在模块级别支持更高种类。有一些解释 (here and author's comment here) 关于 OCaml 的哪些特性与更高级类型的机会冲突。
如果我没理解错的话,主要问题出在以下事实:
- OCaml 不遵循类型定义的 "freshness" 限制:构造
type
可以定义别名(类型将保持不变)和新的新类型 - 可以隐藏类型别名定义
AFAIK,标准 ML 具有不同的类型定义和别名结构:type
用于别名,datatype
用于新类型引入。
不幸的是,我不太了解 SML -- 是否可以导出隐藏定义的类型别名?如果有任何其他 SML 功能仍然不能很好地适应更高类型的机会,有人可以告诉我吗?
仿函数可能会出现一些问题 -- 能否请您提供一个代码示例?我听说过很多次这样的案例,但仍然没有找到完整的例子。
是的,SML 可以通过仿函数来表达高等类型的等价物,也可以将它们抽象化。无用的例子:
functor F (type 'a t) :> sig type 'a u end =
struct
type 'a u = ('a t) t
end
但是,与 OCaml 不同,SML(官方)没有高阶仿函数,因此根据标准,您只能用这种方式表达二阶类型构造函数。
FWIW,OCaml 可能对类型别名和生成类型使用相同的关键字(type
vs datatype
在 SML 中),但它们在句法上仍然通过右侧区分。所以这与 SML.In 两种语言没有真正的区别,签名中出现的抽象可以实现为类型别名或生成类型。所以 Leo 暗示的类型推断问题同样存在于两者中。 Haskell 可以在没有这个问题的情况下逃脱,因为它在类型抽象方面没有相同的表现力(即,模块没有 "sealing" 运算符)。