Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 获取类型中的值列表_Haskell - Fatal编程技术网

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

在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 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
等都不是类型。)正确的术语是什么?@Shane
Spades
是一个值(类型
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]]