【发布时间】:2016-03-28 19:15:42
【问题描述】:
给定一个类型T 是否可以创建一个类型包含的所有可能值的列表(如果它是有界的)?例如,如果T 是Boolean,则列表应该是Set(True, False)。
【问题讨论】:
-
您是在寻找代数集中的所有值吗?
-
“代数”集是什么意思?
标签: scala
给定一个类型T 是否可以创建一个类型包含的所有可能值的列表(如果它是有界的)?例如,如果T 是Boolean,则列表应该是Set(True, False)。
【问题讨论】:
标签: scala
您正在寻找类似于 Haskell 的 Bounded 类型类的东西?你可以在 scalaz 中找到它
> val bounded = implicitly[Enum[Boolean]]
bounded: scalaz.Enum[Boolean] = scalaz.std.AnyValInstances$booleanInstance$@108745fc
> (bounded.min |@| bounded.max)(_ |-> _)
res1: Option[List[Boolean]] = Some(List(false, true))
您可以找到Enum、Bounded 和Applicative 的参考资料。享受吧。
请注意,为所有 Ints 创建列表可能需要相当长的时间...
【讨论】:
allValues = enumFrom minBound 使用了Enum 和Bounded 的函数。
Finite的实例是这样实现的(或等效的),但是一个类型可以是有限的,没有自然顺序,因此不是Enum或Bounded。例如。具有“下一个”操作的循环类型,该操作最终返回起点,但没有开始/结束。或Complex Int.
并非所有类型都已关闭。例如,Boolean 包含所有可能的值Set(True, False),但Double 的答案是什么?
听起来您正在寻找定义代数类型。在 Scala 中,惯用的方法是使用 sealed trait 以及案例类和对象。详情请见this question。
【讨论】:
Doubles 已关闭,“只有”2^64 个 :-D