因此,问题是对于任何整数n,是否存在正好具有n个类型的值。对于n = 0和n = 1,答案应该是明确的(零,很多),但是对于n> 1呢?
对于任何整数n,是否存在正好具有n个类型的值?
我将假设您的意思是“对于任何整数n≥0”。
对于n = 0,并且n = 1,答案应该清楚(零,很多)
让我明白这些明确的答案是否是:
datatype one = One
,datatype two = One | Two
,datatype three = One | Two | Three
,在这种情况下,这些值构造函数中的任何一个在任何时候都仅属于一种类型。) >如果这不是您问题的正确解释,您是否可以澄清和阐述问题以及这些明确的答案?继续这种解释是正确的假设,这是对n> 1:
要使值具有多种类型,该值必须是多态的。我可以想到两种方式:
对于“ ad-hoc polymorphism”(又名重载):n = K:具有多种类型的重载内置运算符的一些有限示例(例如,具有+
和int * int -> int
类型的real * real -> real
老实说,我不确切知道有多少类型的+
重载,但我可以看到它至少是3:
- 1 + 1;
> val it = 2 : int
- 1.0 + 1.0;
> val it = 2.0 : real
- 0w1 + 0w1;
> val it = 0wx2 : word
所以对于任意的K≥3:是的,op +
是正好具有K个类型的值。
也许有多个具有不同类型数量的重载内置值,但是由于只有有限数量的重载内置运算符,所以这仅适用于极少数n> 1,而不适用于所有n >一般为1。
对于“ parametric polymorphism”:值[]
具有类型'a list
,但也具有类型int list
,real list
,bool list
等。我不知道您是否会说它有无限多种类型,但是我想您可以这么说。但是即使您确实这么说,类型'a something
的值也不会具有类型的有限数n> 1。而且('a, 'b) something
也不是这样,等等。
我想不出其他方式让值在SML中具有不止一种类型的价值,而不仅仅是两种多态性。一个有趣的后续问题是,除了这两种方式之外,是否存在有意义的方法来定义具有n个类型(其中n> 1)的n个类型的任何类型的值。
如果问题是“对于every
整数n≥0,是否存在正好具有n个values的type?”答案是“是”,因为对于n = 1,您具有datatype One = One
,对于n = 2,您具有datatype Two = One | Two
,依此类推。对于n = 0,您可以构造没有公开构造函数的抽象/不透明类型。在Haskell中,这种类型只是data Void
,没有= ...
部分,但是在SML中缺少此语法,您可以执行以下操作:signature VOID = sig type t end
structure Void :> VOID = struct type t = unit end
fun whyNot (x : Void.t) = "I wonder how one might call this function."
即使Void.t
被定义为unit
,它也变得不透明,隐藏了()
值构造函数:
- whyNot ();
! Toplevel input:
! whyNot ();
! ^^
! Type clash: expression of type
! unit
! cannot have type
! Void.t
因此Void.t
和unit
之间的等价不公开,给出类型Void.t
0的值。
这个问题的答案很简单:不。