什么使scala中的类/特征成为ADT

什么使scala中的类/特征成为ADT,scala,types,algebraic-data-types,Scala,Types,Algebraic Data Types,将Scala特质/类别归类为ADT的要求是什么 scala中所有密封的特性/类都是ADT吗?或者它需要更多的属性才能成为ADT,比如说对方法fold的支持 密封特征/类的所有实现是否都应该是案例类? 文件说明如下 代数数据类型(ADT)之间的自动映射(以 Scala作为案例类和密封特征)和这些 陈述 代数数据类型是一种复合类型,即通过组合其他类型形成的类型 定义取自维基百科 什么是产品类型? 人员类型由姓名和年龄类型组合而成 您需要姓名和年龄来构造Person类型。意思是人是姓名和年龄类型

将Scala特质/类别归类为ADT的要求是什么

  • scala中所有密封的特性/类都是ADT吗?或者它需要更多的属性才能成为ADT,比如说对方法
    fold
    的支持
  • 密封特征/类的所有实现是否都应该是
    案例
    类? 文件说明如下

    代数数据类型(ADT)之间的自动映射(以 Scala作为案例类和密封特征)和这些 陈述

代数数据类型是一种复合类型,即通过组合其他类型形成的类型

定义取自维基百科

什么是产品类型? 人员类型由姓名和年龄类型组合而成

您需要姓名和年龄来构造Person类型。意思是人是姓名和年龄类型的乘积(代数积,而不是数学积)

什么是总和类型? Closable可以通过文件或套接字创建。其中一个就足以创建Closable的实例。文件和套接字称为总和类型

为什么要密封? 密封不是强制性的,但它是良好的实践

使用密封的
时会发生什么情况?
不能在另一个文件中声明可关闭的另一个子类型。所有子类型必须在单个文件中显示。这将阻止模式匹配出现匹配错误。具有的所有子类型都位于一个文件中,并且只有库作者才能添加更多子类型(对于库)

为什么
案例
? 案例是由scala编译器生成的

  • 使用apply、applySeq、unapply和UNAPLYSEQ方法初始化伴生对象
  • 也会自动生成equals、copy、toString等
  • 在模式匹配时,它有助于取消case类的结构
  • 折叠怎么样? 折叠完全是另一个概念,它与ADT无关

    最后,ADT看起来像这样

    sealed trait Closable
    case class File(path: String, name: String) extends Closable
    case class Socket(port: Int) extends Closable
    
    也可以有抽象类

    sealed abstract class Closable
    case class File(path: String, name: String) extends Closable
    case class Socket(port: Int) extends Closable
    
    哈斯克尔ADTs 但是,在Scala中,sum类型是使用继承来模拟的

    sealed trait Closable
    class File(path: String) extends Closable
    class Socket(port: Int) extends Closable
    
    sealed trait Closable
    case class File(path: String, name: String) extends Closable
    case class Socket(port: Int) extends Closable
    
    sealed abstract class Closable
    case class File(path: String, name: String) extends Closable
    case class Socket(port: Int) extends Closable
    
    data Closable = File { path :: String, name :: String } | Socket { port :: Int }