获取包含所有数据类型可能值的数组?

Get Array containing all data type posible values?

给定的是不是可以

data Letter = A | B | C | ... | Z

自动获取包含所有可能值的数组:

[A, B, C, ..., Z]

?

您可以使用自动派生的 Generic 类型 class:

data Letter = ...
derive instance Generic Letter _

请注意 derive 行末尾的下划线:Generic 类型 class 有两种类型 - (1) 您正在描述的数据类型和 (2)它的通用描述,但后者将由编译器自动为您提供。这就是下划线的意思。

然后您可以通过索引枚举所有元素,使用 genericBottom/genericTop to get the index range and genericFromEnum/genericToEnum 转换 to/from 整数。

一个小问题是 genericToEnum returns 一个 Maybe,因为严格来说不是每个整数都可以转换为枚举值,但在这种情况下你知道所有的数字是有效的,因为你首先通过 genericFromEnum 获得了它们,所以你可以 mapMaybe 而不是常规地图:

allElements ::
  forall a rep.
  Generic a rep =>
  GenericBoundedEnum rep =>
  GenericTop rep =>
  GenericBottom rep =>
  Array a
allElements = mapMaybe genericToEnum (idxFrom..idxTo)
  where
    idxFrom = genericFromEnum (genericBottom :: a)
    idxTo = genericFromEnum (genericTop :: a)

用法:

allLetters :: Array Letter
allLetters = allElements

请注意,allElements 函数足够通用,可以与任何类型一起使用,前提是 (1) 它的所有构造函数都是无参数的,并且 (2) 它有一个 Generic 实例。