2014-01-07 25 views
2

Im OOP /試圖學習haskell的命令式程序員,我正在開發一款紙牌遊戲作爲練習。發現在值中使用了哪個VALUE構造函數

此時,即時試圖因爲它遵循以定義庫甲板:

data Suit = Hearts 
     | Diamonds 
     | Spades 
     | Clubs 
     deriving(Show, Eq) 

type CardValue = Int 

data Card = Ace {cSuit :: Suit} 
      | Two {cSuit :: Suit} 
      | Three {cSuit :: Suit} 
      | Four {cSuit :: Suit} 
      | Five {cSuit :: Suit} 
      | Six {cSuit :: Suit} 
      | Seven {cSuit :: Suit} 
      | Eight {cSuit :: Suit} 
      | Nine {cSuit :: Suit} 
      | Ten {cSuit :: Suit} 
      | Jack {cSuit :: Suit} 
      | Queen {cSuit :: Suit} 
      | King {cSuit :: Suit} 
      deriving(Show, Eq) 

type Hand = [Card] 
type Deck = [Card] 

cardValue :: Card -> Int 
cardValue card = 
     | card.ValueConstructorName == Ace = 11 
     | card.ValueConstructorName == Seven = 10 
     | otherwise       = 0 

1)card.ValueConstructorName是幻想字段/方法/不管。有沒有一種方法來實現這個使用衛兵?

2)我真的需要在值構造函數的每一個選擇中都鍵入'{cSuit :: Suit}'嗎?

3)這種抽象牌組合是否合理?我的意思是,使用嵌套類型 感謝您

回答

8

1)這稱爲模式匹配。

cardValue (Ace suit) = 11 
cardValue (Seven suit) = 10 
cardValue .... 

2)不會。這是一個非常繁瑣的方式來表示卡。這裏有一個非常明顯的模式;在haskell中,當你看到一個非常重複的模式時,你可以保證有一些方法可以抽象出一些東西來使事情更好。請嘗試以下操作:

data Value = Ace | Two | Three | .... | King deriving (Show, Eq, Enum) 

這個最好的部分是你可以像這樣的一個數據類型派生Enum,並Enum定義了一個名爲fromEnum函數會CardValue轉化爲Int。正如您所料,第0構造將是0,等等,所以如果王牌== 1,則:

cardValue1 :: Value -> Int 
cardValue1 x = 1 + fromEnum x 

然後定義卡片:

data Card = Card Value Suit 

,或者如果你真的想記錄:

data Card = Card {valueOfCard :: Value, suitOfCard :: Suit} 

但通常使用具有2個字段的數據類型的記錄是非常沒有意義的。甚至:

type Card = (Value, Suit) 

則:

cardValue :: Card -> Int 
cardValue (Card v _) = cardValue1 v 

3) '幾乎所有' 類型的嵌套。除嵌套類型外,您沒有其他選擇。有幾種基本類型,你幾乎肯定不會看到,而其他類型只是這些基元的一些組合。

0

你需要的是模式匹配:

cardValue :: Card -> Int 
cardValue (Ace suit) = ... 
cardValue (Two suit) = ... 
cardValue (Three suit) = ... 
... 

你可以這樣或者case語句

cardValue :: Card -> Int 
cardValue card = case card of 
    Ace suit -> ... 
    Two suit -> ... 
    ... 

至於這是否是一個很好的模式或不,我會推薦它。 user2407038顯示的方式是更好的選擇,尤其是與EnumBounded類型類型結合使用時。

相關問題