gpt4 book ai didi

scala - 左偏和右偏?

转载 作者:行者123 更新时间:2023-12-01 23:50:51 26 4
gpt4 key购买 nike

我读了一篇关于 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 中的和类型的一些示例,它们只有两个可能的值。在这些情况下,我们可以使用 mapflatMap 在“满意的场景”的情况下将函数应用于值(Some for Option,Right for Either 等)否则保持不变(如果是 None、Left 等)。

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

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

我不确定你所说的“它与Function1有什么关系”是什么意思。它是一个参数的函数。您可以使用它来映射flatMap 前面示例中的二值数据类型(Option、Either 等)。

关于scala - 左偏和右偏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48762428/

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