【问题标题】:Get list of values in type获取类型中的值列表
【发布时间】:2016-12-17 01:56:43
【问题描述】:

在 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 --

如果没有硬编码值,这将如何实现?

【问题讨论】:

  • 是的,但这与“类型列表”无关。
  • ... 或类型类。 (JQSpadesHearts 等不是类型。)
  • 正确的术语是什么?
  • @Shane Spades 是一个值(Suit 类型)。它也是一个构造函数。 (另一个例子,Just "foo" 是一个值(Maybe String 类型),Just 是一个构造函数。)
  • @duplode 那么更好的问题是“获取类型中的值列表?”

标签: haskell


【解决方案1】:

在这种情况下,最简单的方法是让编译器通过派生的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

或列表理解版本:

deck :: [Card]
deck = [Card rank suit | rank <- enumFrom minBound :: [Rank], suit <- enumFrom minBound :: [Suit]]

【讨论】:

  • 11:13: Couldn't match expected type ‘[Rank]’ with actual type ‘Int’
  • @Shane 是的,对不起。它应该是enumFrom,而不是fromEnum
  • 您也可以使用列表理解。我会添加那个替代方案
  • [Rank][Suit] 注释不是必需的(Card 的使用可以适当地推动推理)。
  • 另外,我添加了一个简短的解释性句子。如果您不喜欢它,请随意回滚。
猜你喜欢
  • 1970-01-01
  • 2018-07-26
  • 2015-12-12
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多