Haskell 获取类型中的值列表
在Haskell中,是否可以动态获取类型中的值列表?一个具体的例子是通过组合每个等级和套装中的一个来生成一套完整的扑克牌,以创建一张牌列表:Haskell 获取类型中的值列表,haskell,Haskell,在Haskell中,是否可以动态获取类型中的值列表?一个具体的例子是通过组合每个等级和套装中的一个来生成一套完整的扑克牌,以创建一张牌列表: data Rank = 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | J | Q | K | A data Suit = Spades | Hearts | Diamonds | Clubs data Card = Card Rank Suit deck :: [Card] deck = -- get list of rank
data Rank = 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | J | Q | K | A
data Suit = Spades | Hearts | Diamonds | Clubs
data Card = Card Rank Suit
deck :: [Card]
deck = -- get list of ranks and suits to create a deck --
如果没有硬编码值,这将如何实现?在这种情况下,最简单的方法是让编译器通过派生的
Enum
实例生成代码
data Rank = Two | Three | Four | Five | Six | Seve | Eight | Nine | Ten | J | Q | K | A
deriving (Show, Enum, Bounded)
data Suit = Spades | Hearts | Diamonds | Clubs
deriving (Show, Enum, Bounded)
data Card = Card Rank Suit
deck :: [Card]
deck = do
rank <- enumFrom minBound :: [Rank]
suit <- enumFrom minBound :: [Suit]
return $ Card rank suit
data Rank=2 | 3 | 4 | 5 | 6 | Seve | 8 | 9 | 10 | J | Q | K | A
派生(显示、枚举、有界)
数据套装=黑桃|红桃|钻石|梅花
派生(显示、枚举、有界)
数据卡=卡片等级
甲板::[卡片]
甲板=do
排名是的,但这与“类型列表”无关。。。。或者使用类型类。(J
、Q
、Spades
、Hearts
等都不是类型。)正确的术语是什么?@ShaneSpades
是一个值(类型Suit
)。它也是一个构造函数。(在另一个例子中,Just“foo”
是一个值(类型为可能为String
),而Just
是一个构造函数。)@duplode那么更好的问题是“获取类型中的值列表吗?”11:13:无法将预期类型“[Rank]”与实际类型“Int”匹配
@Shane yeah抱歉。它应该是enumFrom
,而不是fromEnum
。您也可以使用列表理解。我要补充的是,[Rank]
和[Suit]
注释不是必需的(使用卡可以适当地进行推理)。此外,我还添加了一个简短的解释句。如果您不喜欢,请随时回滚。
deck :: [Card]
deck = [Card rank suit | rank <- enumFrom minBound :: [Rank], suit <- enumFrom minBound :: [Suit]]