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