左偏和右偏?

2023-12-23

我读过一篇关于部分统一 http://eed3si9n.com/herding-cats/partial-unification.html作者提到了左偏和右偏数据类型。
有人可以向我解释一下吗?左偏和右偏数据类型?
与什么有关系功能1?
Is Either左倾还是右倾?


我会给出更广泛的答案,希望你不要介意。

ADT,即代数数据类型,可以分为总和类型 and 产品类型。这并不是 Scala 特有的,而是一个通用的函数式编程概念。

产品类型包含多个带有隐式布尔值的基础类型and它们之间。例如,学生是名字andand Age and已注册课程。另一方面,Sum 类型有一个隐式的or它们之间。例如,汽车是保时捷or Audi or法拉利。

在 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 and flatMap在“满意的场景”的情况下将函数应用于值(Some用于Option,Right用于Either等),否则保持不变(如果是None,Left等)。

但是,只有当所涉及的总和类型为右偏。右偏意味着函数如map and flatMap仅适用于“右侧”或“快乐的一侧”,而另一侧保持不变。在 Scala 2.12 之前,Either 是无偏见的,这意味着您不能只采用某物的 Either 并映射它。目前还不清楚映射函数应该应用于右还是左。您需要使用“正确的投影”才能使其右偏,从而可映射和可平面映射(这也意味着它可以用于理解等,所以它非常方便)。

但正如我所说,使用 Scala 2.12。它变得右偏,恕我直言,这是一个更好的设计选择,并且与其他库中的其他类似总和类型完美契合。例如,现在很容易从 Either 转到 \/ (scalaz 分词),因为不存在偏差不匹配。它们是完全同构的。

我不确定你所说的“这与什么有关系”是什么意思Function1“。这是一个参数的函数。这就是你用来map and flatMap前面示例中的双值数据类型(Option、Either 等)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

左偏和右偏? 的相关文章

随机推荐