什么使scala中的类/特征成为ADT
将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吗?或者它需要更多的属性才能成为ADT,比如说对方法
的支持李>fold
- 密封特征/类的所有实现是否都应该是
类? 文件说明如下 代数数据类型(ADT)之间的自动映射(以 Scala作为案例类和密封特征)和这些 陈述案例
时会发生什么情况?
不能在另一个文件中声明可关闭的另一个子类型。所有子类型必须在单个文件中显示。这将阻止模式匹配出现匹配错误。具有的所有子类型都位于一个文件中,并且只有库作者才能添加更多子类型(对于库)
为什么案例
?
案例是由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 }