2015-11-04 198 views
2

我在Haskell中有一个函数,它返回一个卡的后继者。我知道如何使用列表理解来访问卡,但不太清楚如何获得下一张卡,所以pos + 1。这里是我的代码:列表中的下一个元素

pCard::Card->Deck->Card 
pCard (K,C) _ = (A,S) --exception for last card 
pCard crd pck = head [p|(pos,p)<-(zip [0..51] pck),crd==p] 

回答

3

提示:使用dropWhile (/= crd) pck直到你的卡被发现从一开始就删除所有的牌。然后,第一张剩余的卡片是crd。之后的那个是你想要的。

不过,如果pck是一个标准订单的套牌,循环遍布整个套牌找到下一张卡似乎是相当低效的。

+0

怎么样找到前辈。那一个工作! –

+0

做对应。 'last $ takeWhile(/ = crd)pck' – karakfa

3

您可以让您的Card类型实例化类型deriving Enum,然后使用succ函数获取后继卡。 请注意,将卡组的最后一张牌传递给succ将导致运行时错误,尽管看起来您的第一个pCard函数体将解释此错误。

我刚刚注意到你的Card类型看起来是一个元组;我猜你使用type关键字定义了Card?在这种情况下,如果不使用GHC扩展,我上面提出的解决方案将无法使用。

相关问题