1

私はHaskell(およびプログラミング)にまったく慣れていません。私の課題は、1 組のカード (別名 52 枚) を返す関数を定義することです。コードの横のメモに私の思考プロセスを含めようとしています。

-- 私が定義した値

data Suit = Club | Diamond | Heart | Spade  deriving (Show, Enum)

data Value = Two | Three | Four | Five | Six | Seven
          | Eight | Nine | Ten | Jack | Queen
          | King | Ace  deriving (Show, Enum) 

type Card = (Suit, Value)  -- A card must have a suit and a value
type Deck = [Card]        -- A deck consists of a list of cards

fullDeck :: Deck    -- My function is supposed to consist of a deck
fullDeck = [(suit, value) | suit <- [Club..Spade], value <- [Two..Ace]]  -- Tried my luck using ''list comprehensions''. Is it necessary to type [Club..Spade] or does it work for just [Club..] as well? 

コードが読み込まれません。私が得ているエラー:

beginner.hs:11:62: error:
    A section must be enclosed in parentheses thus: (Two.. Ace)
   |
11 | fullDeck = [(suit, value) | suit <- [Club..Spade], value <- [Two..Ace]]

どのように解決しようとしても、いくつかの新しいエラーが表示されるため、明らかに、特定できないいくつかの大きな失敗をしています。

また、現時点で私のリストは無限の量で構成されているため、デッキに 52 枚のカードしかないようにする方法にも興味があります。

4

1 に答える 1

6

データ コンストラクター (と など) と演算子の間にスペースを使用するのを忘れました。そうしないと、Haskell はこれを修飾されたインポートなどに使用されるドットとして認識します。ClubSpade..

以下の作品:

[(suit, value) | suit <- [Club .. Spade], value <- [Two .. Ace]]
--                            ^  ^                     ^  ^

これにより、期待されるものが生成されます。

Prelude> [(suit, value) | suit <- [Club .. Spade], value <- [Two .. Ace]]
[(Club,Two),(Club,Three),(Club,Four),(Club,Five),(Club,Six),(Club,Seven),(Club,Eight),(Club,Nine),(Club,Ten),(Club,Jack),(Club,Queen),(Club,King),(Club,Ace),(Diamond,Two),(Diamond,Three),(Diamond,Four),(Diamond,Five),(Diamond,Six),(Diamond,Seven),(Diamond,Eight),(Diamond,Nine),(Diamond,Ten),(Diamond,Jack),(Diamond,Queen),(Diamond,King),(Diamond,Ace),(Heart,Two),(Heart,Three),(Heart,Four),(Heart,Five),(Heart,Six),(Heart,Seven),(Heart,Eight),(Heart,Nine),(Heart,Ten),(Heart,Jack),(Heart,Queen),(Heart,King),(Heart,Ace),(Spade,Two),(Spade,Three),(Spade,Four),(Spade,Five),(Spade,Six),(Spade,Seven),(Spade,Eight),(Spade,Nine),(Spade,Ten),(Spade,Jack),(Spade,Queen),(Spade,King),(Spade,Ace)]

@Amalloy が言うように、 type を作成し、次のBoundedように記述することもできます。

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

data Value = Two | Three | Four | Five | Six | Seven
          | Eight | Nine | Ten | Jack | Queen
          | King | Ace  deriving (Show, Enum, Bounded)

fullDeck :: Deck    -- My function is supposed to consist of a deck
fullDeck = [(suit, value) | suit <- [minBound ..], value <- [minBound ..]]

または、ヘルパー値を定義できます。

boundedAll :: (Bounded a, Ord a) => [a]
boundedAll = [minBound ..]

そして、次のように書きます。

fullDeck :: Deck
fullDeck = (,) <$> boundedAll <*> boundedAll
于 2018-09-19T18:19:50.510 に答える