获取包含所有数据类型可能值的数组?
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
实例。
给定的是不是可以
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
实例。