2014-09-11 65 views
0

我已經定義了卡牌西服哈斯克爾

module Card (Suit(..), Rank(..), Card(..)) where 
import Data.List 

data Suit = Club | Diamond | Heart | Spade 
      deriving (Eq, Ord, Bounded, Enum) 

suitchars = "CDHS" 

data Rank = 
    R2 | R3 | R4 | R5 | R6 | R7 | R8 | R9 | R10 | 
    Jack | Queen | King | Ace 
     deriving (Eq, Ord, Bounded, Enum) 

rankchars = "23456789TJQKA" 

data Card = Card {suit::Suit, rank::Rank} 
      deriving (Eq, Bounded) 

instance Ord Card where 
    compare (Card s1 r1) (Card s2 r2) = 
     let suitorder = compare s1 s2 
     in if suitorder == EQ then compare r1 r2 else suit order 

,我嘗試使用

getSuit:: [Card] -> Suit 
getSuit [Card s r] = Suit [Card s r] 

得到我的卡的西裝,但它不工作,我也有一對牌列表

allCards :: [Card] 
allCards = [Card suit rank | suit <- [Club .. Spade], rank <- [R2 .. Ace]] 

cardPair :: [[Card]] 
cardPair = [[c1, c2] | c1 <- allCards, c2 <- allCards, c1 < c2 ] 

現在我想搬出去,或繼續從cardPair卡的配對,包含卡那件衣服,但我得到的問題

+2

*「它不工作[...]我有問題」*。什麼不行?什麼問題?編譯器錯誤?運行時異常?你的貓着火了嗎?此外,ThreeFX提供了一個不錯的'cardPair'函數[上次](http://stackoverflow.com/questions/25600917/haskell-pair-two-cards),但它與你當前的問題有什麼關係? (其實,你的帖子無論如何都缺少一個問題) – Zeta 2014-09-11 11:59:33

回答

0

所以,如果我說得對,當給出一張卡片對的列表時,你只想保留那些具有相同花色的那些對。或者只有那些具有不同花色的對子。

首先,由於該函數的名稱是cardPairs而不是cardLists,所以我建議您使用元組而不是列表。

cardPair :: [(Card,Card)] 
cardPair = [(c1, c2) | c1 <- allCards, c2 <- allCards, c1 < c2 ] 

之後,你可以申請一個filter到結果列表中,在任平等或C1和C2西裝不平等過濾。 (我想這就是你打算使用你的getSuit函數)。您分別使用fstsnd來獲取元組的第一個元素和第二個元素。

關於getSuit,看看你的定義:

getSuit :: [Card] -> Suit 
getSuit [Card s r] = Suit [Card s r] 

函數的類型定義說:[Card s r]是卡的列表。我認爲,類型應該是

getSuit :: Card -> Suit 
1

關於:出現上述情況

getSuit:: [Card] -> Suit 
getSuit [Card s r] = Suit [Card s r] 

幾個錯誤:

首先,Suit是一個類型,而不是一個值。所以,你不能「返回」它:... = Suit ...是不正確的。需要注意的是圖案

getSuit [Card s r] = ... 

匹配完成已經結合s的西裝r到基層。所以,一個可以寫,而不是

getSuit:: [Card] -> Suit 
getSuit [Card s r] = s 

這將通過類型檢查,但會觸發非詳盡模式匹配」如果啓用了警告的警告,但問題是,getSuit需要[Card]作爲輸入,這意味着名單警告告訴我們,功能定義涵蓋列表中只包含一張卡片的情況,但如果使用兩張或更多卡片的列表或者甚至是一張空的卡片列表進行調用,將會失敗。也許你實際上想要以下內容:

getSuit:: Card -> Suit 
getSuit (Card s r) = s 

在這裏,不涉及任何列表。