美文网首页
Scala Basic - Algebraic Data Typ

Scala Basic - Algebraic Data Typ

作者: sunnyaxin | 来源:发表于2021-08-22 17:02 被阅读0次

Overview

这篇文章来一起讨论下Scala中的ADT,也就是Algebraic Data Types,这个名字乍听之下有一种不明觉厉的感觉,容易让初学者望而却步,那么什么是ADT?


1. 什么是ADT

Algebraic Data Types,从名字可以看出来,ADT就是一种数据类型,我们可以用它来结构化数据。且我们也可以把ADT当作一种pattern来使用,因为他能作为一种通用方法解决一些常见场景。

1.1 Sum Type

举个ADT的简单例子

sealed trait Color
case object Red extends Color
case object Yellow extends Color
case object Green extends Color

这个ADT的例子,也可以叫做是 Sum Type,这里的类型 Color 可以由一个具体的 object 类型来扩展,所以 Color 可能的类型也就是这个 object 类型的和(sum),即

type Color = Red + Yellow + Green

也就是说,Color类型就是Red 或者Yellow 或者Green,而因为 Sum Type 枚举了某种类型所有可能的类型,所以我们也可以叫它 枚举类型(Enumerated types)

Tips
  1. 为什么用 “sealed trait”?
    • “sealed” 关键字使我们定义的所有trait以及其扩展类都必须在同一个文件下;
    • “sealed”使得编译器会做更详细的检查,例如在pattern matching使会检查是否对所有类型都进行了处理,如果没有编译时会报错;
  2. 为什么用 “case object”?
    • “object”而不是“class”:扩展类型不带参数,则用 “object”,否则应该使用 “class”;
    • “case object” 而不是 “object”:因为 case 封装了很多有用的方法,例如 unapply, equals, toString等,所有在scala实现过程中,如果能用case 尽量不用 class;

1.2 Product Type

另一个ADT的例子

case class Location(x: Double, y: Double)

这个ADT的例子,也可以叫做是 Product Type,这里的类型 Location 是由 x的值和 y 的值共同决定的,也就是其乘积(product)的个数决定的,即:

type Location = Long * Long

这里也可以看出一点Scala和数学之间的关系,Product Type时和 与操作 (AND operation) 相关联,而 Sum Type和 或操作 (OR operation)相关联。

1.3 Hybrid Type

再来一个ADT的例子

sealed trait Response
case class OK(v: String) extends Response
case class Error(error: String, description: String) extends Response

在这个ADT的例子中

  1. Response是 Sum Type,因为其类型是 OK 或者 Error
  2. Error 是 Product Type,因为其类型由 errordescription 的乘积来决定其可能性;
  3. 所以整体来说,这个ADT例子,也可以较多 Hybrid Type,也就是同时包括 Sum Type 和 Product Type;

Hybrid Type 也可以叫做 Sum of Product types

2. 为什么要使用ADT

网上或者书籍上其实没有直接的解释为什么要存在ADT,但这并不是一个在Scala中才出现的新概念,Scala最早借鉴了 Haskell 中的概念。

Scala中很多常用的类型,例如 Option, Either, IO, Reader, Writer 等都是ADT,而我们在写Scala代码的过程中为了消除Side Effect也会自定义ADT,其存在对FP有着重要的意义。其推导过程,可以参考这篇博客

相关文章

网友评论

      本文标题:Scala Basic - Algebraic Data Typ

      本文链接:https://www.haomeiwen.com/subject/jcuciltx.html