我在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]
我在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]
提示:使用dropWhile (/= crd) pck
直到你的卡被发现从一开始就删除所有的牌。然后,第一张剩余的卡片是crd
。之后的那个是你想要的。
不过,如果pck
是一个标准订单的套牌,循环遍布整个套牌找到下一张卡似乎是相当低效的。
您可以让您的Card
类型实例化类型deriving Enum
,然后使用succ
函数获取后继卡。 请注意,将卡组的最后一张牌传递给succ
将导致运行时错误,尽管看起来您的第一个pCard
函数体将解释此错误。
我刚刚注意到你的Card
类型看起来是一个元组;我猜你使用type
关键字定义了Card
?在这种情况下,如果不使用GHC扩展,我上面提出的解决方案将无法使用。
怎么样找到前辈。那一个工作! –
做对应。 'last $ takeWhile(/ = crd)pck' – karakfa