左偏和右偏?

时间:2018-02-13 08:30:28

标签: scala

我阅读了一篇关于partial unificaton的文章,作者提到了左偏和右偏数据类型。
有人可以向我解释一下,左偏和右偏数据类型是什么?
它与 Function1 有什么关系?
Either左偏或右偏?

1 个答案:

答案 0 :(得分:6)

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

ADT或代数数据类型可分为和类型产品类型。这不是特定于Scala,而是一般的函数式编程概念。

产品类型包含多个基础类型,它们之间具有隐式布尔。例如,学生是FirstName LastName 年龄 CoursesEnrolled。另一方面,Sum类型在它们之间具有隐式。例如,汽车是保时捷奥迪法拉利。

在Scala中,产品类​​型最常建模为案例类,并且sum类型被建模为层次结构,其中基本特征或抽象类由所有可能的实例(通常是案例类)继承。鉴于我们之前的例子,学生将成为

case class Student(firstName: String, lastName: String, age: Int, classesEnrolled: Vector[Course]) 

和Car将成为

sealed trait Car
trait Porsche extends Car
trait Audi extends Car
trait Ferrari extends Car

在总和类型的情况下,有许多小的设计选择,例如,使用特征或抽象类作为基础,是否为实例使用特征或案例类等。我现在不打算进入。此外,小型FYI:在面向FP的Scala库中,如scalaz,cat,shapeless等,还有其他方便的产品和总和类型表示。

Sum类型可以有两个或更多不同的值;我们的汽车示例有三个。通常我们只需要两个 - Option,Either,Future,Try只是来自vanilla Scala的sum类型的一些例子,它只有两个可能的值。在这些情况下,我们可以使用mapflatMap将函数应用于值“幸福场景”(有些选项,适用于任何一个等)并保持不变(在无,左等情况。

但是,只有当问题的总和类型为右偏差时,才有可能。正确偏见意味着mapflatMap等功能仅适用于“右侧”或“幸福侧”,而另一个则不受影响。直到Scala 2.12,要么是没有偏见的,这意味着你不能只拿一个东西并映射它。目前还不清楚映射函数是应该应用于Right还是Left。您需要使用“正确的投影”才能使其偏向正确,因此可以映射和平面化(这也意味着它可以用于理解等等,所以它非常方便)。

但正如我所说,使用Scala 2.12。它成为了正确的偏见,这是恕我直言,一个更好的设计选择,并与其他图书馆的其他类似的和类型完美契合。例如,现在很容易从Either转到\ /(scalaz dicjuntion),因为没有偏差不匹配。它们完全同构。

我不确定“与Function1有什么关系”是什么意思。它是一个参数的函数。这是您使用mapflatMap之前示例中的双值数据类型(选项,等等)。

相关问题