- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我读了一篇关于 partial unificaton 的文章作者提到了左偏和右偏数据类型。
有人可以向我解释一下什么是左偏和右偏数据类型吗?
它与Function1有什么关系?要么
左偏还是右偏?
最佳答案
我会给出更广泛的答案,希望你不要介意。
ADT(即代数数据类型)可分为求和类型和乘积类型。这并不是 Scala 特有的,而是一个通用的函数式编程概念。
产品类型包含多个基础类型,它们之间有隐式 bool 值和。例如,学生是名字和姓氏和年龄和已注册类(class)。另一方面,求和类型在它们之间有隐式的或。例如,汽车是保时捷或奥迪或法拉利。
在 Scala 中,产品类型最常被建模为案例类,总和类型被建模为层次结构,其中基本特征或抽象类由所有可能的实例(通常是案例类)继承。根据我们之前的示例,学生将是
case class Student(firstName: String, lastName: String, age: Int, classesEnrolled: Vector[Course])
汽车将是
sealed trait Car
trait Porsche extends Car
trait Audi extends Car
trait Ferrari extends Car
对于总和类型,有很多小的设计选择,例如是否使用特征或抽象类作为基类,是否使用特征或案例类作为实例,等等。我现在不打算讨论这个问题。另外,仅供引用:在面向 FP 的 Scala 库(例如 scalaz、cats、shapeless 等)中,还有其他方便的乘积和求和类型表示。
Sum 类型可以有两个或多个不同的值;我们的汽车示例有三个。通常我们只需要两个 - Option、Either、Future、Try 只是普通 Scala 中的和类型的一些示例,它们只有两个可能的值。在这些情况下,我们可以使用 map
和 flatMap
在“满意的场景”的情况下将函数应用于值(Some for Option,Right for Either 等)否则保持不变(如果是 None、Left 等)。
但是,只有当所讨论的总和类型是右偏时,这才有可能。右偏意味着诸如 map
和 flatMap
之类的函数仅适用于“右侧”或“快乐的一侧”,而使另一侧保持不变。在 Scala 2.12 之前,Either 是无偏的,这意味着您不能只采用某物的 Either 并映射它。目前还不清楚映射函数应该应用于右还是左。您需要使用“正确的投影”才能使其右偏,从而可映射和可平面映射(这也意味着它可以用于理解等,所以它非常方便)。
但正如我所说,使用 Scala 2.12。它变得右偏,恕我直言,这是一个更好的设计选择,并且与其他库中的其他类似总和类型完美契合。例如,现在很容易从 Either 转到\/(scalaz 分词),因为不存在偏差不匹配。它们是完全同构的。
我不确定你所说的“它与Function1
有什么关系”是什么意思。它是一个参数的函数。您可以使用它来映射
和flatMap
前面示例中的二值数据类型(Option、Either 等)。
关于scala - 左偏和右偏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48762428/
我是一名优秀的程序员,十分优秀!