如何解决获取包含所有数据类型可能值的数组?
难道不可能吗
data Letter = A | B | C | ... | Z
[A,B,C,...,Z]
?
解决方法
您可以使用自动派生的 Generic
类型类:
data Letter = ...
derive instance Generic Letter _
注意 derive
行末尾的下划线:Generic
类型类采用两种类型 - (1) 您正在描述的数据类型和 (2) 它的通用描述,但是后者将由编译器自动为您提供。这就是下划线的意思。
然后您可以通过它们的索引枚举所有元素,使用 genericBottom
/genericTop
获取索引范围和 genericFromEnum
/genericToEnum
转换为/从整数。
一个小问题是 genericToEnum
返回的是 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
实例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。