Ruby,它允许笛卡尔乘积构造函数吗?

Ruby,它允许笛卡尔乘积构造函数吗?,ruby,constructor,cartesian-product,Ruby,Constructor,Cartesian Product,正如标题所述,Ruby是否允许笛卡尔乘积类型?我到处都找不到 谢谢Ruby根本不允许类型,至少在您似乎使用“类型”这个词的意义上是不允许的。因此,它显然也不支持产品类型 Ruby是一种所谓的“动态类型”语言(使用“类型”一词的实用的程序员行话定义)或非类型语言(使用数学的、类型理论的定义),因此谈论“产品类型”根本没有意义 或者,如果您愿意,您可以将动态类型的语言视为静态类型的语言,其中只有一种类型是所有动态类型的总和类型 但是,如果Ruby有类型,您显然可以构造具有产品类型的值: 将使用元组类

正如标题所述,Ruby是否允许笛卡尔乘积类型?我到处都找不到

谢谢

Ruby根本不允许类型,至少在您似乎使用“类型”这个词的意义上是不允许的。因此,它显然也不支持产品类型

Ruby是一种所谓的“动态类型”语言(使用“类型”一词的实用的程序员行话定义)或非类型语言(使用数学的、类型理论的定义),因此谈论“产品类型”根本没有意义

或者,如果您愿意,您可以将动态类型的语言视为静态类型的语言,其中只有一种类型是所有动态类型的总和类型

但是,如果Ruby有类型,您显然可以构造具有产品类型的值:

将使用元组类型
(Fixnum,Symbol,String)
构造一个三元组,这是产品类型
Fixnum×Symbol×String
的特例。但在Ruby中无法表示和/或强制执行这些类型

如果您想更深入地了解Ruby的类型系统,该项目是一个很好的起点。例如,它包括元组类型,元组类型是产品类型的一个实例。

Ruby根本不允许类型,至少在您似乎使用“类型”这个词的意义上是不允许的。因此,它显然也不支持产品类型

Ruby是一种所谓的“动态类型”语言(使用“类型”一词的实用的程序员行话定义)或非类型语言(使用数学的、类型理论的定义),因此谈论“产品类型”根本没有意义

或者,如果您愿意,您可以将动态类型的语言视为静态类型的语言,其中只有一种类型是所有动态类型的总和类型

但是,如果Ruby有类型,您显然可以构造具有产品类型的值:

将使用元组类型
(Fixnum,Symbol,String)
构造一个三元组,这是产品类型
Fixnum×Symbol×String
的特例。但在Ruby中无法表示和/或强制执行这些类型


如果您想更深入地了解Ruby的类型系统,该项目是一个很好的起点。它包括元组类型,例如,它是产品类型的一个实例。

它允许吗?对它是否在标准库中实现它?可能不会,但也不难理解implement@Chubas:我认为“不会很难实施”是一种严重的轻描淡写。在你可以实现产品类型之前,你首先要实现一个类型系统,尽管这个项目做得很好,但这可能仍然是一个博士级的多年研究项目。那么,特雷弗到底想要什么?(当然,除了一个恰当的教训,即类型实际上并不是他所认为的那样……)这允许吗?对它是否在标准库中实现它?可能不会,但也不难理解implement@Chubas:我认为“不会很难实施”是一种严重的轻描淡写。在你可以实现产品类型之前,你首先要实现一个类型系统,尽管这个项目做得很好,但这可能仍然是一个博士级的多年研究项目。那么,特雷弗到底想要什么?(当然,除了一个恰当的教训,即类型实际上并不是他所认为的那样……)
class Tuple
  include Enumerable; include Comparable

  class << self
    alias_method :[], :new

    def call(length)
      class_name = :"Tuple#{length}"
      return const_get class_name if const_defined? class_name
      const_set class_name, Class.new(self) {
        (@length = length).times do |i| define_method :"_#{i+1}" do @ary[i] end end
      }
    end
  end

  def to_s; "(#{@ary.join(', ')})" end
  def inspect; "#<#{self.class} (#{@ary.map(&:inspect).join(', ')})>" end
  def to_a; @ary.dup end
  def [](*args) @ary[*args] end
  def each(*args, &block) @ary.each(*args, &block) end

  def <=>(other)
    raise TypeError unless other.is_a? self.class
    raise TypeError unless each_with_index.all? {|el, i| other.instance_variable_get(:@ary)[i].instance_of?(el.class) }
    map.with_index {|el, i| el <=> other.instance_variable_get(:@ary)[i] }.find(0) {|cmp| !cmp.zero? }
  end

  def initialize(*args)
    raise ArgumentError unless args.length == self.class.instance_variable_get(:@length)
    (@ary = args).freeze
  end
end
t3 = Tuple.(3)[1, :two, 'three']