如何将F#中的Discriminated Union转换为Scala:
type Expr =
| Val of String
| Integer of Int32
| Lower of Expr * Expr
| Greater of Expr * Expr
| And of Expr * Expr
| Or of Expr * Expr
有一个类似的帖子谈论ADTs in F# and Scala,但这似乎不是我所追求的。
2条答案
按热度按时间ioekq8ef1#
scala中的继承就是这样做的(可能很不幸,因为它比较冗长)
您可以输入更多内容
模式匹配
valueOf作为Expr中的方法可能会更好
几年后,因为这仍然得到一些投票现在,然后。
上面写的仍然有效,但是如果你使用Scala 3,它已经引入了枚举,这要方便得多。
声明现在可以是
或通用版本(带GADT)
用法与以前相同,只是各种构造函数不再位于顶级名称空间中,因此在创建和匹配时,必须编写
Expr.Val
,而不仅仅是Val
(实际上,Scala 2中的习惯做法是,编写case时与我之前的做法稍有不同,以避免case也出现在顶级名称空间中)。简单的import Expr._
将使名称再次直接可用。最后,下面是@mcintyre321评论的一个迟来的回复:是的,当匹配不完全时会有警告。
n1bvdmb62#
我完全同意Didier Dupont,但是如果您需要更高级别的抽象,在Scala中实现选项类型会给您一个很好的直观感受:
来源:https://mauricio.github.io/2013/12/25/learning-scala-by-building-scala-lists-part-3.html