作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据“Haskell for a Great Good”,Bool 的类型声明是
data Bool = True | False
并且 Int 的类型声明可以被认为是类似的
data Int = -2147483648 | -2147483647 | ... | -1 | 0 | 1 | 2 | ... | 2147483647
对于一些抽象代数应用程序,我想创建一个具有有限多个指定值的类似类型,例如,对于某些 $n$,这些值可能是 $0$ 和 $n$ 之间的整数。尽管声明了 Int 的定义,但以下内容不起作用:
data F3 = 0 | 1 | 2
出现错误“类型中的文字非法”。我如何创建一个类型,其中这些是唯一的居民?类似:
data F a = (Int a) => [0..a]
太棒了。
此外,我可以创建一个函数来枚举类型的所有有效值,或返回值列表吗?
最佳答案
您可以使用空构造函数(例如 True
、False
、Nothing
、()
等)
data F3 = Zero | One | Two
deriving (Bounded, Enum, Show)
要枚举所有有效值,我们只需派生 Enum
和 Bounded
并让 GHC 为我们完成所有工作。
enum :: (Bounded a, Enum a) => [a]
enum = [minBound .. maxBound]
λ. enum :: [F3]
[Zero,One,Two]
如果您想像实际的 Int
一样使用这些,您可以使用 fromEnum::Enum a => a -> Int
,这相当于
fromEnum Zero = 0
fromEnum One = 1
fromEnum Two = 2
关于haskell - 创建一个具有有限数量居民的 Haskell 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24856760/
我是一名优秀的程序员,十分优秀!