gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:27:46 24 4
gpt4 key购买 nike

将Scala特性/类别分类为ADT的要求是什么

  • 是否在Scala中都是ADT的密封特征/类?还是需要更多属性才能成为ADT,例如对方法fold的支持?
  • 所有密封特征/类的实现都应该是case类吗?
    文档here在下面说

    automatic mapping between algebraic data types (ADTs) (encoded in Scala as case classes and sealed traits) and these generic representations.

  • 最佳答案

    An algebraic data type is a kind of composite type, i.e., a type formed by combining other types.



    定义取自维基百科

    什么是产品类型?
    class Person(name: String, age: Int)

    人员类型是通过组合姓名和年龄类型形成的。

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

    什么是总和类型?
    trait Closable
    class File(path: String) extends Closable
    class Socket(port: Int) extends Closable

    可以通过File或Socket创建Closable。其中之一足以使一个Closable实例成为可能。文件和套接字称为求和类型。

    为什么是 sealed

    密封不是强制性的,而是良好的做法。

    使用 sealed会发生什么?
    sealed trait Closable
    class File(path: String) extends Closable
    class Socket(port: Int) extends Closable

    您不能在另一个文件中声明Closable的另一个子类型。所有子类型都必须存在于单个文件中。这将阻止模式匹配产生匹配错误。所有子类型都在一个文件中,只有库作者才能添加更多子类型(如果是库)。

    为什么是 case

    情况是Scala编译器生成的
  • 带有apply,applySeq,unapply和unapplySeq方法的类伴侣对象
  • 也等于,复制,toString等也会自动生成
  • 当patten匹配时,它有助于解构case类。

  • fold呢?

    fold完全是另一个概念,它与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

    Haskell ADT
    data Closable = File { path :: String, name :: String } | Socket { port :: Int }

    但是,在Scala中,总和类型是使用继承进行模拟的

    关于scala - 是什么使Scala中的类/特征成为ADT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50876015/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com