2015-11-04 194 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擴展,我上面提出的解決方案將無法使用。

相關問題