heg*_*ash 3 haskell functional-programming scala
我正在尝试以函数式风格编写 Scala 代码,并且想要创建一个自定义类型,例如以下 Haskell 定义:
data Day = Mo | Tu | We | Th | Fr | Sa | Su
Run Code Online (Sandbox Code Playgroud)
我知道 Scala 倾向于从 Haskell 借用一些东西,所以想知道这种声明在 Scala 中是否可能。
我不太了解 Haskell,但我只是快速浏览了一下,看起来数据声明有点像ADT(代数数据类型),给出了 haskell 网站中的这个示例:
data Maybe a = Just a | Nothing
Run Code Online (Sandbox Code Playgroud)
与 Scala 中 Haskell 的数据类型类似的概念Maybe是Option,它表示一个值存在的可能性:
sealed trait Option[+A] { /* some methods */ }
final case class Some[+T](value: T) extends Option[T] { /* some methods */ }
case object None extends Option[Nothing] { /* some methods */ }
Run Code Online (Sandbox Code Playgroud)
在 Scala 中,这些类型的数据类型几乎总是由密封特征(即产品类型)和一些子类型/对象(主要称为求和类型)表示(在本例中),Some与NoneHaskell 中非常相似(Just和Nothing)。
现在,在您的情况下,您的数据不需要这些构造函数,因此您可以将 is 表示为枚举,或者只使用 ADT:
// using ADT
// define product type
sealed trait Day
// define sum types
case object Mo extends Day
case object Tu extends Day
case object We extends Day
case object Th extends Day
case object Fr extends Day
case object Sa extends Day
case object Su extends Day
Run Code Online (Sandbox Code Playgroud)
Scala 2 枚举(一般不推荐,但可以工作):
object Day extends Enumeration {
type Day = Value
val Mo, Tu, We, Th, Fr, Sa, Su = Value
}
Run Code Online (Sandbox Code Playgroud)
或者 Scala3 枚举(如果您使用 Scala3,这是您的最佳选择):
enum Day:
case Mo, Tu, We, Th, Fr, Sa, Su
Run Code Online (Sandbox Code Playgroud)