【问题标题】:Does Scala support an OR composition?Scala 是否支持 OR 组合?
【发布时间】:2021-04-02 19:41:31
【问题描述】:

这个问题可能是一个愚蠢的问题,任何搜索引擎都应该给我一个快速的答案。但是我没有找到任何东西,所以我可能使用了错误的术语。

如果 F# 可以使用| 符号进行异(或)组合:

type LeftOrRightOrNone = 
   | Left of string
   | Right of string
   | None

这意味着LeftOrRightOrNone 只能是Left OR Right OR None 类型。

我们可以通过 sealed trait 拥有相同的约束:

sealed trait LeftOrRightOrNone
case class Left(..) extends LeftOrRightOrNone
case class Right(..) extends LeftOrRightOrNone
case object None extends LeftOrRightOrNone

但我想知道在 Scala 中是否有更简单的方法来声明此类类型?

谢谢

【问题讨论】:

  • 这能回答你的问题吗? Scala variable with multiple types
  • @TomerShetah 不,不是真的。这个答案与我的 sealed trait 建议相同。我的问题是有一个更简单的方法来声明它们。
  • Scala 2 本身不支持副产品。使用无形库或等待 Scala 3
  • 您能解释一下“OR 组合”是什么意思吗?根据我对 F# 的公认有限知识,您展示的内容与“或”或“组合”无关,而只是封闭代数和类型。

标签: scala types functional-programming composition union-types


【解决方案1】:

在 Scala 2 中,您需要使用密封特征和案例类来编写它,就像您描述的那样。 Scala 3 对此有更好的语法:

enum Either[+A, +B]:
   case Left(a: A)
   case Right (b: B)

https://dotty.epfl.ch/docs/reference/enums/adts.html

【讨论】:

    【解决方案2】:

    Scala 中没有这样的东西。您必须通过密封特征来近似它,如图所示。

    但是,有一种方法可以利用 Curry-Howard 同构来encode union types

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 2013-10-03
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      相关资源
      最近更新 更多