【问题标题】:Scala: getting all possible values that a specific type can haveScala:获取特定类型可以具有的所有可能值
【发布时间】:2016-03-28 19:15:42
【问题描述】:

给定一个类型T 是否可以创建一个类型包含的所有可能值的列表(如果它是有界的)?例如,如果TBoolean,则列表应该是Set(True, False)

【问题讨论】:

  • 您是在寻找代数集中的所有值吗?
  • “代数”集是什么意思?

标签: scala


【解决方案1】:

您正在寻找类似于 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))

您可以找到EnumBoundedApplicative 的参考资料。享受吧。

请注意,为所有 Ints 创建列表可能需要相当长的时间...

【讨论】:

  • 你能解释一下为什么以及这看起来如何吗?我查看了源代码,似乎allValues = enumFrom minBound 使用了EnumBounded 的函数。
  • 这个包中Finite的实例这样实现的(或等效的),但是一个类型可以是有限的,没有自然顺序,因此不是EnumBounded。例如。具有“下一个”操作的循环类型,该操作最终返回起点,但没有开始/结束。或Complex Int.
  • 没错,谢谢!但是我在scalaz中找不到它。如果它是为 scala 实现的,最好有参考,如果没有,它仍然很有趣 :)
【解决方案2】:

并非所有类型都已关闭。例如,Boolean 包含所有可能的值Set(True, False),但Double 的答案是什么?

听起来您正在寻找定义代数类型。在 Scala 中,惯用的方法是使用 sealed trait 以及案例类和对象。详情请见this question

【讨论】:

  • Doubles 已关闭,“只有”2^64 个 :-D
  • 哈哈...够公平的。 ?
猜你喜欢
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
相关资源
最近更新 更多