SML中具有有限数量的类型n> 1的值

问题描述 投票:1回答:2

因此,问题是对于任何整数n,是否存在正好具有n个类型的值。对于n = 0和n = 1,答案应该是明确的(零,很多),但是对于n> 1呢?

types sml
2个回答
0
投票

对于任何整数n,是否存在正好具有n个类型的值?

我将假设您的意思是“对于任何整数n≥0”。

对于n = 0,并且n = 1,答案应该清楚(零,很多)

让我明白这些明确的答案是否是:

  • n = 0:否,没有属于零类型的值。 (如果值存在,则它必须具有类型。值在SML中不存在,直到定义了它们的类型。)
  • n = 1:是,有一个值恰好属于一种类型。 (可以无限多种方式表达一个值,该值完全属于一种类型:datatype one = Onedatatype two = One | Twodatatype 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 listreal listbool list等。我不知道您是否会说它有无限多种类型,但是我想您可以这么说。但是即使您确实这么说,类型'a something的值也不会具有类型的有限数n> 1。而且('a, 'b) something也不是这样,等等。

  • 我想不出其他方式让值在SML中具有不止一种类型的价值,而不仅仅是两种多态性。一个有趣的后续问题是,除了这两种方式之外,是否存在有意义的方法来定义具有n个类型(其中n> 1)的n个类型的任何类型的值。


如果问题是“对于every

整数n≥0,是否存在正好具有n个valuestype?”答案是“是”,因为对于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.tunit之间的等价不公开,给出类型Void.t 0的值。


0
投票

这个问题的答案很简单:不。

© www.soinside.com 2019 - 2024. All rights reserved.